【问题标题】:MVC Model Binding return Arrays for ObjectsMVC 模型绑定返回对象的数组
【发布时间】:2014-11-11 16:41:24
【问题描述】:

我有一个具有以下属性的模型:

 public class MyModel{

     public object Name{get;set;}

 }

Name 属性在 MVC 表单上呈现为文本框。当提交 MVC 表单时,Name 属性设置为 Array[String] 类型,长度为 1,其中包含我的值。为什么模型绑定器会创建数组,而不仅仅是将属性设置为字符串对象?

很遗憾,我无法更改该属性的返回类型,因为该属性位于第三方代码中。

更多信息:

我们有两个站点,一个站点将属性绑定为字符串,另一个站点将其绑定为 Array[String]。查看堆栈跟踪,两个绑定事件都通过默认模型绑定器。所以我们遇到的问题是我们的第一个环境与我们的第二个环境有什么不同?两者都使用相同的程序集版本和配置。

【问题讨论】:

  • 你能出示你的View吗?
  • 这可能只是 DefaultModelBinder 的行为。您可能可以通过实现自己的 IModelBinder 来自定义它,该 IModelBinder 可以为对象类型的模型属性执行您想要的操作。
  • 经过进一步调查(大量反编译和咒骂),我们发现第三方代码中隐藏了一个 DI 容器,它没有正确解析字段绑定器。感谢你们阅读并评论了这个问题。

标签: c# asp.net-mvc asp-classic asp.net-mvc-5


【解决方案1】:

您可以通过以下方式覆盖默认模型绑定器的行为。自定义模型绑定器使您能够将默认对象类型更改为您选择的类型。

因为您希望将对象更改为字符串类型。首先需要编写 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) 

【讨论】:

    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    相关资源
    最近更新 更多