ASP.NET MVC 3 Редактировать коллекцию в модели в том же виде - PullRequest
4 голосов
/ 04 сентября 2011

У меня простой вопрос.

У меня есть модель, которая выглядит так:

public class AddEditChildProductModel
{
    public string Name {get; set;}
    public string Sku {get;set;}
    ........
    public IEnumerable<AddEditPriceTierModel> PriceTiers {get;set;}
}
public class AddEditPriceTierModel
{
    public int QtyStart {get;set;}
    public int QtyEnd {get;set;}
    ........
}

У меня вопрос, как мне отредактировать коллекцию в том же виде?

Казалось бы, это было бы очень просто, может быть, я что-то упустил.

Спасибо !!

** Редактировать **

ОК, поэтому я использовал EditorTemplates, но теперь я получаю следующую ошибку:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

Это действие моего контроллера:

public ActionResult EditChildProduct(AddEditChildProductModel model)
        {
            if (!ModelState.IsValid)
                return PartialView("AddEditChildProduct", model);

            ChildProduct childProduct = productService.GetChildProductByID(model.ID);
            AutoMapper.Mapper.Map<AddEditChildProductModel, ChildProduct>(model, childProduct);
            foreach (var tier in childProduct.PriceTiers)
            {
                tier.ChildProduct = childProduct;
            }
            UnitOfWork.Commit();

            return ListChildProducts(model.ProductID);
        }

Разве это не должно работать, так как я получаю ChildProduct с соответствующей коллекцией PriceTiers и использую AutoMapper для сопоставления различий? Я сохраняю скрытые поля для полей PK и FK на PriceTier.

Я немного растерялся.

Ответы [ 3 ]

7 голосов
/ 04 сентября 2011

Вы можете использовать шаблоны редактора:

@model AddEditChildProductModel
@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.Name)
        @Html.EditorFor(x => x.Name)
        @Html.ValidationMessageFor(x => x.Name)
    </div>

    <div>
        @Html.LabelFor(x => x.Sku)
        @Html.EditorFor(x => x.Sku)
        @Html.ValidationMessageFor(x => x.Sku)
    </div>

    <table>
        <thead>
            <tr>
                <th>QtyStart</th>
                <th>QtyEnd</th>
            </tr>
        </thead>
        <tbody>
            @Html.EditorFor(x => x.PriceTiers)
        </tbody>
    </table>

    <input type="submit" value="OK">
}

, а затем определить шаблон редактора, который будет отображаться для каждого элемента списка PriceTiers (~/Views/Shared/EditorTemplates/AddEditPriceTierModel.cshtml) - имя и местоположение редактора.Шаблон важен.Вы также можете поместить его в ~/Views/SomeController/EditorTemplates/AddEditPriceTierModel.cshtml, если шаблон редактора специфичен только для данного контроллера:

@model AddEditPriceTierModel
<tr>
    <td>
        @Html.LabelFor(x => x.QtyStart)
        @Html.EditorFor(x => x.QtyStart)
        @Html.ValidationMessageFor(x => x.QtyStart)
    </td>
    <td>
        @Html.LabelFor(x => x.QtyEnd)
        @Html.EditorFor(x => x.QtyEnd)
        @Html.ValidationMessageFor(x => x.QtyEnd)
    </td>
</tr>

и теперь ваша подпись действия контроллера POST будет выглядеть следующим образом:

[HttpPost]
public ActionResult Edit(AddEditChildProductModel model)
{
    ...
}
6 голосов
/ 04 сентября 2011

Вы можете добавить Статья Фила Хаака "Привязка модели к списку" полезная информация о привязке коллекций сущностей к представлению.

@for (int i = 0; i < Model.MyCollection.Count; i++)
{                    
   @Html.TextBoxFor(m => m[i].Title) 
   @Html.TextBoxFor(m => m[i].Author) 
   @Html.TextBoxFor(m => m[i].DatePublished) 
}


public ActionResult UpdateStuff(MyViewModel vm)
{
}
1 голос
/ 28 марта 2012

Также вы можете найти решение, предоставленное Стивеном Сандерсоном по адресу http://blog.stevensanderson.com/2010/01/28/validating-a-variable-length-list-aspnet-mvc-2-style/.. Мне очень помогли.

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