如何将URL参数绑定到具有不同名称的模型属性

Pol*_*878 10 asp.net-mvc model-binding

好吧,假设我有一个像这样的URL,它通过HTTP动词映射GET到我在下面的控制器操作:

GET /foo/bar?sort=asc&r=true
Run Code Online (Sandbox Code Playgroud)

如何Bar在我的控制器操作上将其绑定到我的模型,我在下面:

class Bar {
    string SortOrder { get; set; }
    bool Random { get; set; }
}

public ActionResult FooBar(Bar bar) {
    // Do something with bar
    return null;
}
Run Code Online (Sandbox Code Playgroud)

请注意,属性名称不会也不一定与URL参数的名称匹配.此外,这些是可选的url参数.

Max*_*oro 12

它不支持开箱即用,但您可以这样做:

class BarQuery : Bar { 

   public string sort { get { return SortOrder; } set { SortOrder = value; } }
   public bool r { get { return Random; } set { Random = value; } }
}

public ActionResult FooBar(BarQuery bar) {
    // Do something with bar
}
Run Code Online (Sandbox Code Playgroud)

您可以实现自定义IModelBinder,但手动映射更容易.


如果您可以更改Bar类,则可以使用此属性:

class FromQueryAttribute : CustomModelBinderAttribute, IModelBinder { 

   public string Name { get; set; }

   public FromQueryAttribute() { }

   public FromQueryAttribute(string name) { 
      this.Name = name;
   }

   public override IModelBinder GetModelBinder() { 
      return this;
   }

   public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
      return controllerContext.HttpContext.QueryString[this.Name ?? bindingContext.ModelName];
   }
}

class Bar {

    [FromQuery("sort")]
    string SortOrder { get; set; }

    [FromQuery("r")]
    bool Random { get; set; }
}

public ActionResult FooBar(Bar bar) {
    // Do something with bar
    return null;
}
Run Code Online (Sandbox Code Playgroud)

  • @gdoron你想跟随别人的意见,而不是想好,但不要把它称为黑客,因为事实并非如此. (7认同)
  • 这不是一个黑客.IMO愚蠢的是,ASP.NET MVC没有开箱即用. (3认同)
  • 我的意思是,虽然这是一个很好的"黑客",但MVC团队真的建议避免编写自定义模型绑定器."一般来说,我们建议人们不要编写自定义模型绑定器,因为它们很难正确,而且很少需要它们" (2认同)

gdo*_*ica 5

模型绑定器将它从视图获取的参数与名称中操作中的模型匹配,因此如果它们不匹配,则绑定将不起作用.

你有的选择:

  1. 将输入名称与模型属性名称相匹配......但是你说你不能这样做,(原因不明).
  2. 编写自定义模型粘合剂.*
  3. 使用带有前缀的Bind属性 - 尽管它仍然会强制您使输入名称接近模型属性名称.

所以基本上,你不能做你想要的.


更新:

您在评论中写道,属性可以与参数名称匹配,因此不要编写可能成功进行绑定的自定义属性,只需编写ViewModel(VM fromMVC ...)来调整url参数名称.

MVC团队不建议编写自定义模型绑定器:

在一般情况下,我们建议人们不要写自定义模型粘合剂,因为他们难以得到的权利和他们很少需要
这里