从列表并在Post上获得列表返回(更新值)
本文关键字:列表 返回 更新 并在 Post | 更新日期: 2023-09-27 18:16:33
我有一个列表在我的ViewModel我解析到视图
List<BoolSetting>
BoolSetting:
public class BoolSetting
{
public BoolSetting(string displayName, bool value)
{
DisplayName = displayName;
Value = value;
}
public string DisplayName { get; set; }
public bool Value { get; set; }
}
然后我想为列表中的所有项目打印一个复选框,因此列表在ViewModel中视图使用
@foreach(var boolSettingList in Model.BoolSettingList)
{
<div>
@Html.CheckBox(boolSettingList.DisplayName, boolSettingList.Value)
@boolSettingList.DisplayName
</div>
}
问题是当我发布这个,然后我的模型没有保存更新的设置(bool值)在我的ViewModel列表中,因此对象是空的。
I could do
foreach (var VARIABLE in userSettingConfigViewModel.BoolSettingList)
{
VARIABLE.Value = (bool)Request.Form[VARIABLE.DisplayName];
}
但是这个视图模型将有许多列表,其中一些列表将具有相同的名称!这会导致冲突
所以有一种方法来foreach打印所有我的bool,然后使MVC找出把数据放回列表对象后?我不能让CheckBoxFor工作,因为它需要一个表达式我不能想出一种方法来遍历我的列表
我可以用模板修复它,通过为BoolSetting和List创建一个模板吗?
首先固定视图模型并删除自定义构造函数,否则默认模型绑定器将无法实例化它,您将不得不编写自定义模型绑定器和其他东西:
public class BoolSetting
{
public string DisplayName { get; set; }
public bool Value { get; set; }
}
public class MyViewModel
{
public List<BoolSetting> Settings { get; set; }
}
然后写一个控制器动作来填充你的视图模型:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
Settings = new[]
{
new BoolSetting { DisplayName = "name 1", Value = true },
new BoolSetting { DisplayName = "name 2", Value = false },
new BoolSetting { DisplayName = "name 3", Value = true },
}.ToList()
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
然后是一个视图(~/Views/Home/Index.cshtml
),其中您只需使用编辑器模板,不编写任何foreach
循环或弱类型的html帮助程序,如Html.CheckBox
。通过使用编辑器模板,您将确保所有输入字段都具有正确的名称,以便默认模型绑定器能够在回发期间将其值获取到视图模型中:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Settings)
<button type="submit">OK</button>
}
,最后是视图模型的相应编辑器模板,它将为集合(~/Views/Home/EditorTemplates/BoolSetting.cshtml
)的每个元素呈现:
@model BoolSetting
<div>
@Html.CheckBoxFor(x => x.Value)
@Html.LabelFor(x => x.Value, Model.DisplayName)
@Html.HiddenFor(x => x.DisplayName)
</div>