gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:49:59 25 4
gpt4 key购买 nike

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

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com