我正在尝试以下方案。
在初始GET上,我的控制器返回一个带有string[]
属性的默认模型。
在视图上,我使用文本框显示此属性:
@Html.TextBoxFor(model => model.MyProperty)
数组显示为逗号分隔列表。大!
问题在于,当我回发时,列表最终成为单个字符串数组,其中所有项目以逗号分隔在该字符串中。
有没有办法可以提供一个解串器(可能是WPF中的转换器),这会让它回到正确的数组?
我知道我也可以使用@ Html.EditorFor(...),但这会将我的数组呈现为一个我不想要的单独文本框的列表。
答案 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
中的值)。