如何重写FormCollection中的键(我需要这样做,因为我有一个属性绑定到一个视图中的多个CheckBoxes )?当post back正在运行时,我确实尝试了一下:
formCollection["DecisionReasons"] = formCollection["DecisionReasons"].Replace(",false", "").Replace("false,", "").Replace(",","|");...but当我执行UpdateModel时,只更新模型中的第一个值(在我的模型中,我有一个DecisionReason字符串)。
我需要一个ModelBinder吗(我怎么做?)或者有其他方法可以做到这一点?
发布于 2011-08-15 18:03:17
我在上面做了评论,询问更多细节,但我得到的印象是您使用复选框来表示Flags枚举中的各个值。
默认的模型绑定器不以这种方式处理映射标志,但我发现在this article中有一个定制的模型绑定器可以处理映射标志。
编辑:
好的,我从您的更新中看到(如果您将其添加到您的问题中,而不是将其作为答案发布会更好),您的模型有一个逗号分隔的字符串属性,其中包含每个选定的DecisionReasons。
我建议您考虑使用ViewModel。ViewModel是您的模型的抽象,根据您在视图中呈现它的方式进行定制。
您可以从您的模型类派生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作为视图的模型,并使用DecisionReasonValues而不是DecisionReasons来呈现复选框。ASP.NET MVC将从您的复选框填充DecisionReasonValues,但您可以通过重写的DecisionReasons属性将它们作为逗号分隔的字符串进行访问。
发布于 2011-08-15 19:26:28
视图的一部分
<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)如果我在我的视图中选中了多个复选框,我的模型属性字符串将被更新为只有一个值(如果在视图中我选中了2个复选框,我的模型将被更新为第一个值,所以我需要模型属性的值为"valu1,valu2“,依此类推)。
对不起,我的英语不好。
https://stackoverflow.com/questions/7063414
复制相似问题