FormCollection修改键

时间:2011-08-15 09:26:14

标签: c# asp.net-mvc-3

如何覆盖FormCollection中的键(我需要这个,因为我有一个绑定到View中多个CheckBox的属性)?当帖子回来时,我确实试过这个:

formCollection["DecisionReasons"] = formCollection["DecisionReasons"].Replace(",false", "").Replace("false,", "").Replace(",","|");

...但是当我在UpdateModel中时,只在模型中更新了第一个值(在我的模型中,我有一个DecisionReason字符串)。

我需要一个ModelBinder(我该怎么做?)还是有其他方法可以做到这一点?

2 个答案:

答案 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”等。)

抱歉我的英语不好。