我有一个具有以下属性的模型:
public class MyModel{
public object Name{get;set;}
}
Name属性呈现为MVC表单上的文本框。提交MVC表单时,Name属性的设置类型为Array [String],长度为1,其值为my。为什么模型绑定器创建数组而不是仅将属性设置为字符串对象?
不幸的是,我无法更改属性的返回类型,因为此属性位于第三方代码中。
更多信息:
我们有两个站点,一个站点将属性绑定为字符串,另一个站点将其绑定为Array [String]。查看堆栈跟踪,两个绑定事件都将通过默认的模型绑定器。那么我们遇到的问题是我们的第一个环境与第二个环境有什么不同?两者都使用相同的程序集版本和配置。
答案 0 :(得分:3)
您可以通过以下方式覆盖默认模型活页夹的行为。自定义模型绑定器使您能够将默认对象类型更改为您选择的类型。
您希望对象更改为字符串类型。首先需要编写您选择的实现,其中IModelBinder有帮助。
public class CustomBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
HttpRequestBase request = controllerContext.HttpContext.Request;
string name = request.Form.Get("Name");
return name
}
}
然后我们应用程序将在发布我们需要注册的数据之前命中Application_Start()。 通过将模型绑定器的定义添加到Application_Start()
中 ModelBinders.Binders.Add(typeof(MyModel), new CustomBinder());
然后在Post方法中使用自定义绑定,您将获得表单数据
public ActionResult Index([ModelBinder(typeof(CustomBinder))] MyModel model)