asp.net-mvc-3 - mvc3提交模型为空

标签 asp.net-mvc-3

我有一个我不明白的问题,似乎没有一种简单的方法来调试这个问题。我相信这很简单。

@model StartStop.ServiceResources.UserSettings

我的 MVC3 View 绑定(bind)了一个特定的模型;

 public class Setting
{
    public Int64 SettingID { get; set; }
    public Int64 UserID { get; set; }
    public int PreferenceType { get; set; }
    public string PreferenceName { get; set; }
    public bool PreferenceBool { get; set; }
    public int PreferenceInt { get; set; }
    public string PreferenceString { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }

}

public class UserSettings
{
    public Int64 UserID { get; set; }
    public List<Setting> Settings { get; set; }
}

View 列出代表列表的复选框;

  @using (Html.BeginForm("ManageAccount","Account", FormMethod.Post))
        {
            <table class="tbl" cellspacing="0">

                <tr>
                    <th>Preference</th>
                    <th>Setting</th>
                </tr>

                @if (Model != null)
                {
                    foreach (var item in Model.Settings.ToList())
                    {
                        <tr>
                            <td>@item.PreferenceName
                            </td>
                            <td>
                                @if (item.PreferenceType == 2)
                                {
                                    @Html.CheckBoxFor(modelItem => item.PreferenceBool)
                                }
                            </td>
                        </tr>

                    }
                }
            </table>

            <input type="submit" value="Save Changes" class="action medium" />

        }

很好,我将数据加载到 View 中,它呈现 View 并选择正确的设置。但是,当我在底部发帖时, View 模型返回空值!我不确定为什么...

 [HttpPost]
    [Authorize]
    public ActionResult ManageAccount(StartStop.ServiceResources.UserSettings model)
    {
        if (ModelState.IsValid)
        {

            foreach (StartStop.ServiceResources.Setting oSetting in model.Settings)
            {
                StartStop.Helpers.UserPreferences.SaveUserSetting(oSetting);
            }
        }
        return View(model); 
    }

有人可以帮忙吗?

最佳答案

在您看来,问题出在以下行:

@Html.CheckBoxFor(modelItem => item.PreferenceBool)

我看到人们经常在他们的 View 中编写以下 lambda 表达式 modelItem => item.SomeProperty 并询问为什么模型绑定(bind)器不能正确绑定(bind)他们 View 模型上的集合属性。

这不会为复选框生成正确的名称,因此默认模型 Binder 能够重新创 build 置集合。我建议您阅读 following blog post以便更好地理解模型绑定(bind)器期望的正确格式。

像这样尝试:

@model StartStop.ServiceResources.UserSettings
@using (Html.BeginForm("ManageAccount", "Account", FormMethod.Post))
{
    <table class="tbl" cellspacing="0">
        <tr>
            <th>Preference</th>
            <th>Setting</th>
       </tr>

       @if (Model != null)
       {
           for (var i = 0; i < Model.Settings.Count; i++)
           {
               <tr>
                   <td>@Model.Settings[i].PreferenceName</td>
                   <td>
                       @if (Model.Settings[i].PreferenceType == 2)
                       {
                           @Html.CheckBoxFor(x => x.Settings[i].PreferenceBool)
                       }
                    </td>
                </tr>
           }
       }
    </table>

    <input type="submit" value="Save Changes" class="action medium" />
}

话虽如此,我建议您使用编辑器模板,如下所示:

@using (Html.BeginForm("ManageAccount","Account", FormMethod.Post))
{
    <table class="tbl" cellspacing="0">
        <tr>
            <th>Preference</th>
            <th>Setting</th>
       </tr>

       @if (Model != null)
       {
           @Html.EditorFor(x => x.Settings)
       }
    </table>

    <input type="submit" value="Save Changes" class="action medium" />
}

然后定义一个自定义编辑器模板,它将自动为 Settings 集合的每个元素呈现 (~/Views/Shared/EditorTemplates/Setting.cshtml):

@model StartStop.ServiceResources.Setting
<tr>
    <td>@Model.PreferenceName</td>
    <td>
         @if (Model.PreferenceType == 2)
         {
             @Html.CheckBoxFor(x => x.PreferenceBool)
         }
     </td>
 </tr>

此外,我在此表单中可以看到的唯一输入字段是绑定(bind)到模型上的 PreferenceBool 属性的复选框。因此,在您的 POST Controller 操作中,您将初始化 Settings 列表属性,但不要指望在此 Setting 类中找到其他属性的任何值,除非您当然在表单中包含它们的输入字段(更准确地说,在我展示的编辑器模板中)。

关于asp.net-mvc-3 - mvc3提交模型为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9442953/

相关文章:

c# - ASP.Net MVC 3,使用ViewModel,错误ViewModel不是IEnumerable

c# - 检查动态创建的文本框是否被 Javascript 弄脏

c# - 将列表中的数据绑定(bind)到网格控件

asp.net-mvc-3 - Html.RenderPartial 和 Ajax.BeginForm -> Submit 被调用两次

asp.net-mvc - 如何在 Entity Framework 中为GUID设置NewId()

asp.net-mvc-3 - 检查 .NET MVC 中的 AngularJS $resource Request Server Side

c# - 如何在 MVC View Razor 中屏蔽密码

asp.net-mvc-3 - ASP.Net MVC 3 : optgroup support in Html. DropDownListFor

asp.net-mvc-3 - ASP.NET MVC 中如何调用 Error.cshtml?

asp.net-mvc - 如何使用 Razor ASp.NET MVC 连接 HTML 元素的 id