MVC 3 - Передача списка флажков в контроллер - PullRequest
2 голосов
/ 07 марта 2012

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

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

public ViewResult CreateUpdateInfoSource(int ProgrammeId)
        {
            List<ProgInfoSourceModel> viewmodel = new List<ProgInfoSourceModel>();
            List<ProgInfoSourceDTO> myProgInfoDTOList = progInfoSourceService.AllInfoSources(); 
            if (myProgInfoDTOList.Count != 0)
            {
                foreach (var x in myProgInfoDTOList)
                {
                    ProgInfoSourceModel insert = new ProgInfoSourceModel();
                    insert.Selected = false;
                    insert.ProgrammeId = ProgrammeId;
                    insert.InfoSourceId = x.InfoSourceId;
                    insert.InfoSource = x.InfoSource;
                    insert.InfoReference = x.InfoReference;
                    insert.Rank = x.Rank;

                    viewmodel.Add(insert);
                }
            }

            return View(viewmodel);
        }

Я могу распаковать это в представлении просто отлично, однако у меня есть реальная проблема с передачей списка обратно моему контроллеру. Мне нужно иметь возможность просматривать список в моем контроллере и видеть, какие из них применимы или нет, чтобы я мог обновить базу данных.

Моя модель выглядит так:

namespace ProgrammeSpec.MVC.Models
{
    public class ProgInfoSourceModel
    {
        [DisplayName("Selected")]
        public bool Selected { get; set; }
        [DisplayName("Programme Id")]
        public int ProgrammeId { get; set; }
        [DisplayName("Info Source Id")]
        public int InfoSourceId { get; set; }
        [DisplayName("Info Source")]
        public String InfoSource { get; set; }
        [DisplayName("Reference")]
        public String InfoReference { get; set; }
        [DisplayName("Rank")]
        public int? Rank { get; set; }
    }
}

Мой взгляд выглядит так:

<html>
<head>
    <title>CreateUpdateInfoSource</title>
</head>
<body>

@using (Html.BeginForm())
{
    <table>
        <tr>
            <th>
                Selected
            </th>
            <th>
                ProgrammeId
            </th>
            <th>
                InfoSourceId
            </th>
            <th>
                InfoSource
            </th>
            <th>
                InfoReference
            </th>
            <th>
                Rank
            </th>
            <th></th>
        </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.CheckBoxFor(modelItem => item.Selected)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ProgrammeId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.InfoSourceId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.InfoSource)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.InfoReference)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Rank)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
                @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
                @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
            </td>
        </tr>
    }


    </table>
    <input type="submit" value="Update" />
}
</body>
</html>

и контроллер, которому передается представление, выглядит следующим образом: (фрагмент)

[HttpPost]
        public ActionResult CreateUpdateInfoSource(List<ProgInfoSourceModel> viewmodel)
        {
            if (ModelState.IsValid)
            {
                try
                {

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

Дополнительным осложнением является то, что количество источников информации будет различаться, поэтому я не могу использовать статическую форму или список и дать каждому ID ...

Это должно быть довольно распространенная проблема с простым решением, но я новичок MVC и не знаю, как это обойти.

1 Ответ

0 голосов
/ 07 марта 2012

Попробуйте использовать шаблон редактора (Вот еще один SO, который отвечает на этот вопрос Как создавать собственные шаблоны редактора / отображения в ASP.NET MVC 3? ), для вашего ProgInfoSourceModel, а затем просто используйте Html.EditorFor(m => m.Model) в представлении.

Когда вы используете цикл foreach, каждый флажок получает одно и то же имя ввода - и, следовательно, фактически не отправляет правильные данные обратно.

Если вы идете по маршруту шаблона редактора, иЗаставить MVC выполнить тяжелую работу по итерации через IEnumerable - он создаст входные данные с именами, такими как 'item [0] .Selected' - которые связыватель модели затем правильно десериализовал обратно в список.

Фил Хаак также ведет блогфантастическое прохождение этого сценария еще в 2008 году: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

...