2013-07-12 99 views
5

我有一個叫做CategoryModel的類,其中一個屬性是同一類型的對象列表。所以CategoryModel.CategoriesList<CategoryModel>類型。MVC EditorFor一個頁面上的多個編輯表單的模型綁定

在類別索引頁面上,我顯示了每個類別的編輯器,以便用戶可以更改任何類別名稱,而無需轉到專用頁面來執行此操作。像這樣:

<ul id="categories> 
    @Html.EditorFor(model => model.Categories) 
</ul> 

而對於CategoryModel編輯模板看起來是這樣的:

<li class="folder"> 
    @using (Html.BeginForm("Edit", "Category", new { id = Model.Key }, FormMethod.Post, new { @class = "ajaxoff"})) { 
     @Html.ValidationSummary(true) 
     @Html.HiddenFor(model => model.Key) 
     @Html.HiddenFor(model => model.ParentKey) 
     @Html.HiddenFor(model => model.Sequence) 
     @Html.HiddenFor(model => model.IncludeDeleted) 

     @Html.TextBoxFor(model => model.Name, null, new { @class = "catName" }) 
     @Html.ValidationMessageFor(model => model.Name) 

     <input type="submit" value="Save" class="icon save" /> 
    } 
</li> 

我是提交表單無法正確綁定到CategoryControllerEdit行動的問題:

[HttpPost] 
public ActionResult Edit(CategoryModel category) 
{ 
    // At this point all properties in category are null 
} 

如果我檢查隱藏字段和文本框的名稱,它們會根據它們在當前類別中的位置進行標記ory(例如Categories[0].Name)。但是,如果我創建專用編輯視圖,則只需根據字段名稱命名(例如Name)。

我試圖改變控制器接受分類的列表:

[HttpPost] 
public ActionResult Edit(List<CategoryModel> categories) 
{ 
    var category = categories.First(); 
} 

這個作品,如果我提出的第一個類別,但沒有其他人(在這些案件Categories爲空)。

我也試圖改變我如何顯示我EditorFor,這樣做:

<ul id="categories> 
    @foreach (var cat in Model.Categories) 
    { 
     @Html.EditorFor(model => cat); 
    } 
</ul> 

從而改變字段名稱每個類別(例如,所有類別名稱叫cat.Name)一樣,這是我相信是朝着正確方向邁出的一步。

那麼如何正確地綁定到我的控制器?我意識到我可以提交整個父類別,然後保存每個子類別,但這似乎是提交單個更改的非常低效的方式。

回答

6

我發現瞭如何做到這一點。沒有爲Html.EditorFor過載,使您可以指定htmlFieldName屬性(在下面的例子中的第三個參數):

@foreach (var cat in Model.Categories) 
{ 
    @Html.EditorFor(model => cat, null, ""); 
} 

這使得所有字段名沒有任何前綴,讓我成功提交任何單一類別。

+1

我這樣做了,但在字段名後面仍然有[0]和[1],你是怎麼處理的? – Dennis

+1

我沒有得到你描述的問題。如果您使用@ Html.EditorFor(model => model.Categories,null,「」)而不是上面的循環,則會在字段名稱之前獲得[0]和[1],但是,因爲您要將數組傳遞給EditorFor方法而不是單個模型。 – Maloric

0

您的編輯操作接受CategoryModel類別,因此您需要重置模型前綴以進行正確綁定。爲此,您需要創建的HtmlHelper自己的擴展方法是這樣的:

public class BeginHtmlScope : IDisposable 
    { 
     private readonly TemplateInfo templateInfo; 
     private readonly string previousHtmlFieldPrefix; 

     public BeginHtmlScope(TemplateInfo templateInfo, string htmlFieldPrefix) 
     { 
      this.templateInfo = templateInfo; 

      previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix; 
      templateInfo.HtmlFieldPrefix = htmlFieldPrefix; 
     } 

     public void Dispose() 
     { 
      templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix; 

     } 
    } 
    public static class MyHtmlExtensions 
    { 
     public static IDisposable BeginHtmlScope(this HtmlHelper html, string htmlFieldPrefix) 
     { 
      return new BeginHtmlScope(html.ViewData.TemplateInfo, htmlFieldPrefix); 
     } 
    } 

,然後用它你的編輯器模板中:

@using (Html.BeginHtmlScope("")) 
{ 
    <li class="folder"> 
    @using (Html.BeginForm("Edit", "Category", new { id = Model.Key }, FormMethod.Post, new { @class = "ajaxoff"})) { 
     @Html.ValidationSummary(true) 
     @Html.HiddenFor(model => model.Key) 
     @Html.HiddenFor(model => model.ParentKey) 
     @Html.HiddenFor(model => model.Sequence) 
     @Html.HiddenFor(model => model.IncludeDeleted) 

     @Html.TextBoxFor(model => model.Name, null, new { @class = "catName" }) 
     @Html.ValidationMessageFor(model => model.Name) 

     <input type="submit" value="Save" class="icon save" /> 
    } 
</li> 

} 
+0

不幸的是,這與foreach循環具有相同的問題 - 字段名稱是Categories [0] .Name,Categories [1] .Name等,並且CategoryModel不綁定到Edit操作。 – Maloric

+0

我很抱歉誤會你的問題。我編輯了我的答案。 –

相關問題