Asp.net mvc 如何在ASP.NET MVC中禁用路由值的绑定?

Asp.net mvc 如何在ASP.NET MVC中禁用路由值的绑定?,asp.net-mvc,binding,Asp.net Mvc,Binding,据我所知,ValueProviderDictionary从3个位置获取绑定值 从邮寄表格 从路线值 来自查询字符串 我希望能够禁用第二个和第三个选项。我在这里看到的唯一解决方案是创建自己的自定义ValueProvider(复制粘贴ValueProviderDictionary源文件并从中删除这两个选项) 这个解决方案正确吗?还有其他更优雅的选择吗 (如果带有自定义ValueProvider的解决方案正确,则应在何处初始化?在控制器的操作方法中还是在自定义ModelBinder中?) 谢谢您重写C

据我所知,ValueProviderDictionary从3个位置获取绑定值

  • 从邮寄表格
  • 从路线值
  • 来自查询字符串
  • 我希望能够禁用第二个和第三个选项。我在这里看到的唯一解决方案是创建自己的自定义ValueProvider(复制粘贴ValueProviderDictionary源文件并从中删除这两个选项)

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

    (如果带有自定义ValueProvider的解决方案正确,则应在何处初始化?在控制器的操作方法中还是在自定义ModelBinder中?)


    谢谢您

    重写Controller.Initialize(),并在该方法中设置ValueProvider属性(在调用base.Initialize()之后)


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

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

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

    源代码放在此处:。唯一的问题是,如果您想将填充模型作为参数,它将不起作用。

    有趣的问题+1!若我在控制器的Initialize方法中初始化ValueProvider,正如您所说,那个么我将不会得到任何来自表单之外的ActionMethod参数,而是会得到ArgumentException。因此,初始化ValueProvider的位置应该是OnActionExecuting。但现在,若控制器将填充的模型作为动作参数传递,我仍将从RouteData获取值。所以我仍然看不到这个简单问题的100%解决方案啊,当你这样说的时候,它改变了问题参数绑定实际上只是对UpdateModel()的美化调用,因此它们实际上是相同的代码路径。UpdateModel()的重载将IDictionary作为参数,您可以将自定义提供程序传递给它。不过,一个更好的问题是,为什么要尝试为模型参数绑定不同的值提供程序,而不是为UpdateModel()调用绑定?你的应用程序有什么不同之处?这可能会使我们朝着更高效的方向发展。我想从不同的ValueProvider绑定,在我的例子中是简单表单值提供程序,因为如果我离开默认值,它可能会导致意外行为。如果我保留默认值,我应该始终注意与RouteData值的偶然匹配。例如,如果未提供路由数据的Id,则默认为空字符串,并且当我在创建模型时更新模型时,根本不需要该Id值。这不仅可能发生在Id值上,也可能发生在任何其他值上。我不想每次在RouteData中添加新属性或新值时都对这一点产生警惕。在Post方法中执行UpdateModel时,我只想从发布的数据中获取值。Hanselman在他的博客中提出了解决这个问题的方法。他把晚餐改成了晚餐!!!这对我来说是完全错误的。奇怪的是,这是UpdateModel的默认行为。