如果我的模型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的属性名称)可以在字典中不再重复。

最佳答案

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

高温超导

关于c# - 在MVC编辑后重建ICollection吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4724504/

10-12 14:54