Asp: net MVC 3: @ Html.Editor Для подколлекции моей модели в шаблоне ?

Я долго не мог отредактировать подколлекцию моей модели, коллекция модели становилась нулевой. .

Наконец-то я нашел решение, но оно показалось мне немного грязным:

Сначала данные моих тестов:

Объект модели :

    public class ContainerObject
    {
        public String Title { get; set; }
        public List<ContainedObject> ObjectList { get; set; }
    }

Объект вспомогательной коллекции :

public class ContainedObject
{
    public int Id { get; set; }
    public String Text { get; set; }
    public Boolean IsSelected { get; set; }
}

Метод контроллера, который сгенерировать объект

    public ActionResult TestForm()
    {
        return View(new ContainerObject()
        {
            Title = "This is a sample title",
            ObjectList = new List<ContainedObject>()
                {
                    new ContainedObject(){Id=1, IsSelected = true, Text="ObjectOne"},
                    new ContainedObject(){Id=2, IsSelected = false, Text="ObjectTwo"},
                    new ContainedObject(){Id=3, IsSelected = true, Text="ObjectThree"},
                    new ContainedObject(){Id=4, IsSelected = false, Text="ObjectFour"},
                }
        });
    }

Контроллер, который получает отредактированный объект

    [HttpPost]
    public ActionResult TestFormResult(ContainerObject filledObject)
    {
        return View();
    }

Представление

@model WebTestApplication.Models.ContainerObject

@{
    ViewBag.Title = "TestForm";
}
@using (Html.BeginForm("TestFormResult","Home", FormMethod.Post)){
    @Html.EditorFor(x => x.Title)
    Html.RenderPartial("ContainedObject", Model.ObjectList);
    <input type="submit"  value="Submit"/>
}

Частичное представление (ContendedObject.cshtml)

@model IEnumerable<WebTestApplication.Models.ContainedObject>
@{
    ViewBag.Title = "ContainedObject";
    int i = 0;
}
@foreach (WebTestApplication.Models.ContainedObject currentObject in Model)
{ 
    <br />
    @Html.Label(currentObject.Text);
    @Html.CheckBox("ObjectList[" + i + "].IsSelected", currentObject.IsSelected);                                                                                                     
    @Html.Hidden("ObjectList[" + i + "].Id", currentObject.Id);                                                                                                
    @Html.Hidden("ObjectList[" + i + "].Text", currentObject.Text);
    i++;
}

Это действительно работает, но у меня есть одна проблема:

  • Я должен сам генерировать имена и указывать свойство объекта контейнера

. Я пытался использовать Html.EditorFor вместо Html.RenderPartial в представлении проблема в том, что он генерирует мне имя «ObjectList. [0] .Id» (с дополнительным. Между именем свойства и средством доступа).

Я также пытался использовать только @ Html.EditorFor в частичном представлении, но он создает вары с именем объекта.

Если я не использую какой-либо шаблон, он работает:

    @model WebTestApplication.Models.ContainerObject

@{
    ViewBag.Title = "TestForm";
}
@using (Html.BeginForm("TestFormResult", "Home", FormMethod.Post))
{
    @Html.EditorFor(x => x.Title)
    for (int i = 0; i < Model.ObjectList.Count; i++)
    {
        <br />
        @Html.Label(Model.ObjectList[i].Text);
        @Html.CheckBoxFor(m => Model.ObjectList[i].IsSelected);
        @Html.HiddenFor(m => Model.ObjectList[i].Id);
        @Html.HiddenFor(m => Model.ObjectList[i].Text);
    }

    <br /><input type="submit"  value="Submit"/>
}

Но здесь это простой шаблон, но в моем реальном случае у меня будет гораздо больше данных, и они будут повторно использоваться несколько раз. Итак, какой вариант мне лучше всего подходит?

21
задан Denis Ivin 4 February 2012 в 18:26
поделиться