ASP.NET MVC - разместить несколько сложных объектов с формой - PullRequest
5 голосов
/ 26 января 2010

В приложении ASP.NET MVC я пытаюсь отправить несколько объектов в одной форме. Я могу получить простые типы для отправки обратно, но у меня есть проблемы со сложными типами. Мне кажется, что я подражал примеру, представленному Филом Хааком в его сообщении в блоге Model Binding To A List , но безуспешно. Даже даже копирование его кода безрезультатно.

Я пытаюсь заполнить свойства ProjectNum и TaskNum набора MachineLicenseBillback объектов. К сожалению, IList<MachineLicenseBillback> machinePts всегда заканчивается как ноль при публикации.

Чего мне не хватает?

Класс

public class MachineLicenseBillback
{
    public MachineLicenseBillback() { }

    public virtual int MachineId { get; set; }
    public virtual string ProjectNum { get; set; }
    public virtual string TaskNum { get; set; }
    public virtual string VerifiedFlag { get; set; }
    public virtual DateTime? RcdChgDateTime { get; set; }
    public virtual string RcdChgAgent { get; set; }
}

Действие

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult TrueUp(int id, IList<MachineLicenseBillback> machinePts)
{
  // ...
}

Форма

<% using (Html.BeginForm("TrueUp", "Home", new { id = Model.Customer.Id },
             FormMethod.Post))
   { %>
<input type="hidden" name="machinePts.Index" value="<%= machine.MachineId %>" />

<input type="text" name="machinePts[<%= machine.MachineId%>].ProjectNum"
  value="<%= machine.MachineLicenseBillback.ProjectNum %>" />

<input type="text" name="machinePts[<%= machine.MachineId %>].TaskNum"
  value="<%= machine.MachineLicenseBillback.TaskNum %>" />

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

Ответы [ 2 ]

2 голосов
/ 26 января 2010

Синтаксис .Index был удален для MVC 1 RTM и повторно введен в MVC 2. Для MVC 1 элементы списка должны быть пронумерованы последовательно: machinePts [0], machinePts [1] и т. Д.

0 голосов
/ 26 января 2010

Скотт Хансельман имеет полное прохождение здесь для связывания списков предметов. Короче говоря, ваш метод контроллера нуждается в массиве MachineLicenseBillback, а не IList.

public ActionResult TrueUp(int id, MachineLicenseBillback[] machinePts)
{
  // ...
}

Глядя на свой код, если вы хотите связать с IDictionary (не IList), вы можете вместо этого использовать пары ключ / значение в представлении. Или можете сохранить код, который у вас есть в представлении, и использовать массив в качестве параметра в методе контроллера.

Обратите особое внимание на соглашения об именах. В случае несоответствия именования механизм связывания не будет собирать данные.

...