3

我正在尝试以下场景。

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

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

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

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

问题是,当我回发时,列表以单个字符串数组的形式结束,所有项目都以逗号分隔在该字符串中。

有没有一种方法可以提供一个反序列化器(可能相当于 WPF 中的转换器),可以使它回到正确的数组?

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

4

1 回答 1

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

于 2013-01-07T11:11:19.260 回答