在逗号分隔的列表中保留回发asp.net mvc中的数组

时间:2013-01-06 17:59:55

标签: asp.net-mvc asp.net-mvc-4

我正在尝试以下方案。

在初始GET上,我的控制器返回一个带有string[]属性的默认模型。

在视图上,我使用文本框显示此属性:

@Html.TextBoxFor(model => model.MyProperty) 

数组显示为逗号分隔列表。大!

问题在于,当我回发时,列表最终成为单个字符串数组,其中所有项目以逗号分隔在该字符串中。

有没有办法可以提供一个解串器(可能是WPF中的转换器),这会让它回到正确的数组?

我知道我也可以使用@ Html.EditorFor(...),但这会将我的数组呈现为一个我不想要的单独文本框的列表。

1 个答案:

答案 0 :(得分:4)

您可以为绑定字符串数组创建自定义模型绑定器,如下所示:

public class StringArrayBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        string key = bindingContext.ModelName;
        ValueProviderResult val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (val != null && string.IsNullOrEmpty(val.AttemptedValue) == false)
        {
            bindingContext.ModelState.SetModelValue(key, val);
            string incomingString = ((string[])val.RawValue)[0];

            var splitted = incomingString.Split(',');
            if (splitted.Length > 1)
            {
                return splitted;
            }
        }
        return null;
    }
}

然后在应用程序启动时在global.asax中注册它:

ModelBinders.Binders[typeof(string[])] = new StringArrayBinder();

或者更简单但可重复性更低的方法是:

public string[] MyStringPropertyArray { get; set; }

public string MyStringProperty
{
    get
    {
        if (MyStringPropertyArray != null)
            return string.Join(",", MyStringPropertyArray);
        return null;
    }
    set
    {
        if (!string.IsNullOrWhiteSpace(value))
        {
            MyStringPropertyArray = value.Split(',');
        }
        else
        {
            MyStringPropertyArray = null;
        }
    }
}

在这里,您将绑定到视图中的MyStringProperty。然后在您的商家代码中使用MyStringPropertyArray(填充MyStringProperty中的值)。