如何覆盖FormCollection中的键(我需要这个,因为我有一个绑定到View中多个CheckBox的属性)?当帖子回来时,我确实试过这个:
formCollection["DecisionReasons"] = formCollection["DecisionReasons"].Replace(",false", "").Replace("false,", "").Replace(",","|");
...但是当我在UpdateModel中时,只在模型中更新了第一个值(在我的模型中,我有一个DecisionReason字符串)。
我需要一个ModelBinder(我该怎么做?)还是有其他方法可以做到这一点?
答案 0 :(得分:0)
我在上面评论过,要求提供更多详细信息,但我得到的印象是您使用复选框来表示Flags枚举中的各个值。
默认模型绑定器不会以这种方式处理映射标志,但我找到了this article中的自定义模型绑定器。
编辑:
好的,我从您的更新中看到(如果您将其添加到您的问题中会更好,而不是将其作为答案发布),您的模型会有一个逗号分隔的字符串属性,其中包含每个选定的DecisionReasons。
我建议您考虑使用ViewModel。 ViewModel是模型的抽象,是根据您在视图中呈现它的方式而定制的。
您可以从Model类派生ViewModel,以减少工作量。考虑这个(未经测试的)代码:
public class MyModel
{
public virtual string DecisionReasons { get; set; }
}
public class MyViewModel : MyModel
{
public string[] DecisionReasonValues { get; set; }
public override string DecisionReasons
{
get
{
return string.Join(",", DecisionReasonValues);
}
set
{
DecisionReasonValues = value.Split(',');
}
}
}
使用MyViewModel作为View的模型,并使用DecisionReasonValues呈现复选框,而不是DecisionReasons。 ASP.NET MVC将从您的复选框填充DecisionReasonValues,但您可以通过重写的DecisionReasons属性以逗号分隔的字符串形式访问它们。
答案 1 :(得分:0)
视图的一部分
<div style="width:300px;height:250px;overflow:auto;">
@foreach (var a in (IEnumerable<SelectListItem>)ViewBag.AllDecisionReasons)
{
@Html.CheckBox("DecisionReasons", a.Selected, new { value = a.Value })
<label>@a.Text</label><br />
}
@Html.ValidationMessage("DecisionReasons", (string)Model.DecisionReasons)
如果我在我的View my Model属性中检查多个复选框,则只更新一个值示例字符串(如果在View i中选中2复选框,我的模型将使用第一个值更新,所以我需要该Model属性值“valu1,valu2”等。)
抱歉我的英语不好。