Как я могу привязать список списков к представлению - PullRequest
0 голосов
/ 10 июня 2011

У меня есть ViewModel, у которого есть объект списка, содержащий другие объекты списка, и я хочу связать его с представлением.

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

    for (int i = 0; i < Model.ThFirstList.Count(); i++ )
    {
        Html.EditorFor(model => model.TheFirstList[i] , "myView")
    }

И в «myView» цикл через другой список выглядит так:

    for (int i = 0; i < Model.TheSecondList.Count(); i++ )
    {
        %><%: Html.DropDownListFor(m => m.TheSecondList[i].ThePropertyIWantToSet, aList)%><%
    }

Все выглядит хорошо и на стороне клиента (я думаю), а имя поля выбора естьнапример:

TheFirstList[0].TheSecondList[0].ThePropertyIWantToSet

Когда я не выбираю что-либо из какого-либо из блоков выбора и отправляю данные обратно, тогда устанавливаются объекты TheFirsList и TheSecendList.Однако, если я выберу значение в списке, я получу код ошибки 500 с сервера.Я думаю, что он не может найти подходящий метод контроллера для запроса?Из-за этого я не могу установить свойство ThePropertyIWantToSet.

Может кто-нибудь помочь мне в этом?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Вместо того, чтобы возиться с циклами foreach и т. Д., Я бы просто использовал модель представления и шаблоны редактора. Это облегчает жизнь.

Итак, начнем с просмотра модели:

public class MyViewModel
{
    public IEnumerable<Type1> TheFirstList { get; set; }
}

public class Type1
{
    public IEnumerable<Type2> TheSecondList { get; set; }
}

public class Type2
{
    public string ThePropertyIWantToSet { get; set; }

    public IEnumerable<SelectListItem> Items
    {
        get
        {
            return new[]
            {
                new SelectListItem { Value = "1", Text = "item 1" },
                new SelectListItem { Value = "2", Text = "item 2" },
                new SelectListItem { Value = "3", Text = "item 3" },
            };
        }
    }
}

затем контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // filling with dummy values => those should probably
        // come from your data store
        var model = new MyViewModel
        {
            TheFirstList = Enumerable.Range(1, 2).Select(x => new Type1
            {
                TheSecondList = Enumerable.Range(1, 3).Select(y => new Type2())
            })
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

Тогда соответствующий ~/Views/Home/Index.cshtml просмотр:

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.TheFirstList)
    <input type="submit" value="OK" />
}

Шаблон ~/Views/Home/EditorTemplates/Type1.cshtml:

@model Type1
@Html.EditorFor(x => x.TheSecondList)

и, наконец, шаблон ~/Views/Home/EditorTemplates/Type2.cshtml:

@model Type2
@Html.DropDownListFor(
    x => x.ThePropertyIWantToSet, 
    new SelectList(Model.Items, "Value", "Text")
)

Теперь в действии POST вы получите красивую и правильно привязанную модель представления. Шаблоны редактора позаботятся о создании правильных имен полей ввода. Посмотрите, насколько просто и понятно код. Не нужно писать какие-либо циклы в представлениях, беспокоиться о правильных индексах, просто оставить это для фреймворка.

2 голосов
/ 10 июня 2011

Просмотр модели представления может быть более полезным, но обычно при рендеринге списков выбора из модели представления я использую два отдельных свойства: одно для хранения выбранного значения и другое для фактического хранения самого списка.

ViewModels с дизайном выбора SelectList

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