FormCollection modify keys

本文关键字:keys modify FormCollection | 更新日期: 2023-09-27 18:05:50

如何在FormCollection中重写键(我需要这个,因为我有一个属性绑定到视图中的多个复选框)?当一个post back在Action时,我确实尝试过这个:

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

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

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

FormCollection modify keys

Part of View

<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"等)

对不起,我的英语不好。

我在上面评论过,要求了解更多细节,但我得到的印象是您正在使用复选框来表示Flags枚举中的单个值。

默认的模型绑定器不以这种方式处理映射标志,但我在本文中找到了一个自定义模型绑定器。

编辑:

好的,我从你的更新中看到(如果你把它添加到你的问题中,而不是把它作为答案发布,那就更好了),你的模型有一个逗号分隔的字符串属性,包含每个选定的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作为视图的模型,并使用DecisionReasonValues来呈现复选框,而不是DecisionReasons。ASP。. NET MVC将从你的复选框中填充DecisionReasonValues,但你可以通过覆盖的DecisionReasons属性以逗号分隔的字符串的形式访问它们。