【问题标题】:How to disable binding of the route values in ASP.NET MVC?如何禁用 ASP.NET MVC 中的路由值绑定?
【发布时间】:2009-08-21 21:42:08
【问题描述】:

据我所知,ValueProviderDictionary 从 3 个地方获取绑定值

  1. 来自帖子表单
  2. 从路线值
  3. 来自查询字符串

我希望能够禁用第二个和第三个选项。我在这里看到的唯一解决方案是创建自己的自定义 ValueProvider(复制粘贴 ValueProviderDictionary 源文件并从那里删除这两个选项)。

这个解决方案正确吗?还有更优雅的选择吗?

(如果带有自定义 ValueProvider 的解决方案是正确的,应该在哪里初始化?在 Controller 的操作方法中还是在自定义 ModelBinder 中?)

谢谢

【问题讨论】:

  • 有趣的问题+1!

标签: asp.net-mvc binding


【解决方案1】:

覆盖 Controller.Initialize() 并在该方法中设置 ValueProvider 属性(在调用 base.Initialize() 之后)。

为避免重新实现整个 ValueProviderDictionary,您可以将其子类化。唯一有趣的部分是您必须复制 ValueProviderDictionary.PopulateDictionary() 的一个小 sn-p。在您的构造函数中,调用基本构造函数,然后立即调用 this.Clear(),然后调用 this.YourCustomPopulateDictionary()。这应该会使您的代码更小。

【讨论】:

  • 如果我在控制器的 Initialize 方法中初始化 ValueProvider,如您所说,那么我不会得到任何非来自 Form 的 ActionMethod 参数,而是会得到 ArgumentException。所以初始化ValueProvider的地方应该是OnActionExecuting。但是现在,如果 Controller 将填充模型作为操作参数传递,我仍然会从 RouteData 获取值。所以我仍然没有看到这个 simple 问题的 100% 解决方案
  • 啊,当你这样说时,它会改变问题。 :) 参数绑定实际上只不过是对 UpdateModel() 的美化调用,因此它们实际上是相同的代码路径。 UpdateModel() 的重载将 IDictionary 作为参数,您可以在那里传递您的自定义提供程序。不过,一个更好的问题是,为什么要尝试从不同的值提供者绑定模型参数而不是调用 UpdateModel()?你的应用程序有什么区别这些?这可能会引导我们朝着更富有成效的方向发展。
  • 我想从不同的 ValueProvider 绑定,在我的例子中是简单的表单值提供程序,因为如果我保留默认值,它可能会导致意外行为。如果我保留默认值,我应该始终注意与 RouteData 值的随意匹配。例如,如果未提供路由数据的 Id,则默认为空字符串,并且当我在创建模型时 UpdateModel 时,我根本不想要该 Id 值。它不仅可能发生在 Id 值上,也可能发生在任何其他值上。而且我不想在每次向 RouteData 添加新属性或添加新值时担心这一点。
  • 当我在 Post 方法中执行 UpdateModel 时,我想only 从发布的数据中获取值。 Hanselman 在他的博客bit.ly/uFd0T 中为这个问题做了一个解决方法。他将 Dinner.Id 更改为 Dinner.DinnerID(最后一条评论指出)!!!这对我来说看起来完全错误。奇怪的是它是 UpdateModel 的默认行为。
【解决方案2】:

我已经制作了 Action 属性和 ValueProvider 来解决这个问题。分别将其命名为 GetValuesAttribute 和 StrictValueProviderDictionary。您可以设置源表单、RouteData 或 QueryString。例如,如果您希望 ValueProvider 在 Form 中搜索值,并且可能 QueryString 在您的方法或控制器上方编写以下内容:

[GetValues(ValueSource.Form | ValueSource.QueryString)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formValues)
{
   ...
   UpdateModel(myModel); //model will be updated from mentioned sources

源代码放在这里:http://codepaste.net/2kpzct。唯一的问题是,如果您想将填充模型作为参数,它将无法工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多