MVC3 передает возвращаемое значение null для моего сложного типа данных - PullRequest
2 голосов
/ 29 июня 2011

В моем проекте MVC3 у меня есть следующая модель:

public class CustomerModules
{
    public int ModuleId { get; set; }
    public string ModuleName { get; set; }
    public int CustId { get; set; }
    public bool IsActive { get; set; }
    public DateTime? ActiveDate { get; set; }
}

public class CustomerModuleList
{
    public IEnumerable<CustomerModules> Modules { get; set; }
}

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

[HttpGet]
public ActionResult EditModules(int custNo)
{
    var model = new CustomerModuleList
    {
        Modules = _customerModules.LoadModulesByCustomerId(custNo)
    };

    return View(model);
}

[HttpPost]
public ActionResult EditModules(CustomerModuleList model)
{
    if (ModelState.IsValid)
    {
       var custId = model.Modules.First().CustId;

       _customerModules.UpdateCustomerModules(model.Modules, custId);
    }

    return View(model);

}

А мой фрагмент кода:

<% using (Html.BeginForm("EditModules","Admin",FormMethod.Post, new { enctype = "multipart/form-data" })){ %>
    <%: Html.ValidationSummary(true) %>
    <fieldset>
        <legend>CustomerModuleList</legend>

        <table>
            <tr>
                <th>Module Name</th>
                <th>Active</th>
                <th>Active Date</th>
            </tr>
            <% foreach (var module in Model.Modules){%>
                <tr>

                    <td><%:Html.Label(module.ModuleName) %></td>
                    <td>
                        <%CustomerModules module1 = module;%>
                        <%:Html.CheckBoxFor(x=>module1.IsActive) %>
                    </td>
                    <td><%:Html.Label(module.ActiveDate.ToString()) %></td>
                </tr>
            <% } %>
        </table>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
<% } %>

Когда я отправляю обратно в контроллер, IEnumerable<CustomerModules> Модули возвращаются как нуль. Я хотел бы знать, как вы можете отправить IEnumerable сложного типа в MVC3? У кого-нибудь есть идеи?

Ответы [ 3 ]

3 голосов
/ 30 июня 2011

Проблема в том, что вы не указываете, что объект, который отправляет ваша форма, имеет тип CustomerModuleList.

В вашем файле views / Shared / EditorTemplates создайте представления с именами CustomerModuleList.cshtml и CustomerModules.cshtml.

В CustomerModuleList.cshtml поместите

@model CustomerModuleList
<% foreach (var module in Model.Modules){%>
            Html.EditorFor(x => module);
        <% } %>

, а затем в CustomerModules.cshtml флешку

@model CustomerModules
<tr>
                <td><%:Html.Label(Model.ModuleName) %></td>
                <td>
                    <%:Html.CheckBoxFor(x=>x.IsActive) %>
                </td>
                <td><%:Html.Label(Model.ActiveDate.ToString()) %></td>
            </tr>

, затем, на ваш взгляд, замените цикл for на

Html.EditorFor(x => Model)

проверил это с другим IEnumerable типа, который я сделал, и это сработало.

2 голосов
/ 20 апреля 2013

Это похожая, но не связанная проблема. Я добавляю его сюда в надежде, что сэкономлю 4 часа на устранение неполадок для другого плохого разработчика. Я не знаю, было ли это только в моей системе, но ... в MVC 3 я обнаружил, что если Модель содержит какой-либо вид свойства списка (list, ienumerable, array ...) с именем Member или OrgMember, связыватель модели полностью провалится! Пойди разберись.

1 голос
/ 30 июня 2011

Пожалуйста, проверьте этот пост: http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/, и я надеюсь, что это поможет вам исправить проблемы в вашем приложении:)

PS: Пример работает на MVC3 также без каких-либо дополнительных усилий.

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