MVC编辑后重建ICollection?

时间:2011-01-18 13:19:48

标签: c# .net asp.net-mvc-3 razor

如果我的模型Product有成员ICollection<ProductOption>,如何在我的Product方法中使用成员集重建我的Controller.Edit(...) Edit回来?

(我们可以假设我们从不添加或删除选项,只进行编辑。)

剃刀:

@model Models.Products.Product    
@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/Shared/_GlobalLayout.cshtml";
}

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>         
    @Html.HiddenFor(model => model.Id)
    <legend>Product</legend>
    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>        
    @foreach (ProductOption option in Model.Options)
    {
        <div style="border:1px solid black; margin: 5px; padding:5px 7px;">
            @Html.Partial("_ProductOptionInput", option)
        </div>
    }    
    <p>
        <input type="submit" value="Save" />
    </p>
    </fieldset>
} 

控制器:

[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{           
    var p = _repository.ById(id);
    UpdateModel<Product>(p);

    _repository.SaveChanges();

    return RedirectToAction("Index");          
}

局部视图:

@modelModels.Products.ProductOption

@Html.ValidationSummary(true)
<fieldset>
    <legend>ProductOption</legend>    
    @Html.HiddenFor(model => model.Id)    
    <div class="editor-label">
        @Html.LabelFor(model => model.Term)
    </div>
</fieldset>

更新

FormCollection中的ActionResult Edit(int id, FormCollection collection)本质上是一个字典,因此其中一个已更新的ProductOption具有ProductOption值但其余部分不是键ProductOption (即{{1}}属性名称)不能在字典中重复。

2 个答案:

答案 0 :(得分:1)

您需要编写自己的模型绑定器(用于ICollection<ProductOption>或者将实体从数据库中拉出而不是实例化新实例),或者您不能将模型作为参数,而是在操作方法中将其拉出数据库,然后从控制器调用TryUpdateModel

HTH

答案 1 :(得分:1)

我在Razor视图中添加了以下内容,它就像一个魅力!

@Html.EditorFor(model => model.Options.ToList()[0], templateName: "ProductOptionInput", htmlFieldName: "Options[0]")
@Html.EditorFor(model => model.Options.ToList()[1], templateName: "ProductOptionInput", htmlFieldName: "Options[1]")