【问题标题】:ASP.Net MVC3 - custom model binding, the default model binder, value types and the [Required] attributeASP.Net MVC3 - 自定义模型绑定、默认模型绑定、值类型和 [必需] 属性
【发布时间】:2011-12-17 03:17:30
【问题描述】:

我的操作采用一个由默认模型绑定器绑定的类属性:

public ActionResult MyControllerAction(MyModelClass model) { ...

该类使用了几种非标准的值类型,比如MongoDB的ObjectId值类型,当然是不可为空的。

如果我为 ObjectId 类型创建一个自定义模型绑定器(很容易做到)并将其添加到Application_Start 中,如下所示:

ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdModelBinder());

...它被默认模型绑定器忽略,这似乎仅适用于作为参数直接传递给操作的模型值。

除此之外,我似乎无法让 [Required] 属性将默认(未指定)值识别为未提供。

简而言之:

  • 如何让默认模型绑定器使用注册的自定义模型绑定器来解析模型的属性?
  • 如何让[Required] 将该属性的default 值识别为未指定?

或者——是否已经有一些东西已经处理了所有这些我可以下载并在我的项目中使用的东西?

【问题讨论】:

  • 在视图模型中使用这些花哨的类型不是更简单吗? IMO,视图模型应该非常简单,任何与更复杂类型的转换都应该在控制器中进行。
  • 是的,这就是我所做的,除了每个采用 ID 值的单个操作都需要相同的 sn-p 代码来解析和验证 ID 值。我认为把它放在模型活页夹中会更容易。不过我刚刚想通了,所以我会发布并回答我自己的问题。

标签: asp.net-mvc data-annotations model-binding


【解决方案1】:

好的,已经想通了:

  • DefaultModelBinder 确实使用任何指定的自定义模型绑定器,但前提是在提交的值中实际指定了该值
  • [Required] 属性基本上是“非空”的简写,因此如果该属性被指定为可为空,则它确实有效,即在我的情况下,如果没有指定值,ObjectId? 将触发该属性。李>

这是我发现的一篇很好的博文,解释了其中的一些内容:http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2022-12-16
    相关资源
    最近更新 更多