Восстановление ICollection после редактирования MVC? - PullRequest
2 голосов
/ 18 января 2011

Если в моей модели 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>

UPDATE

My FormCollection в ActionResult Edit(int id, FormCollection collection) по сути является словарем, поэтому он содержит значения ProductOption для одного из обновленных ProductOption s, но не для остальных из них в качестве ключей (то есть свойство ProductOption s имена) не может повторяться в словаре.

Ответы [ 2 ]

1 голос
/ 18 января 2011

Я добавил следующее в окне 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]")
1 голос
/ 18 января 2011

Вам либо нужно написать свой собственный механизм связывания модели (либо для ICollection<ProductOption>, либо тот, который вытаскивает вашу сущность из базы данных вместо создания нового экземпляра), либо вы НЕ можете принять модель в качестве параметра, и вместо этого вытащите его из базы данных в вашем методе действия, затем вызовите TryUpdateModel из контроллера.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...