ASP.NET MVC模型绑定与表单元素名称中的虚线

我一直在搜索互联网,试图找到一种方法来容纳我的表单元素中的破折号到ASP.NET的控制器在MVC 2,3或甚至4中的默认模型绑定行为。

作为前端开发人员,我更喜欢使用CSS中的破折号而不是camelCase或下划线。 在我的标记中,我希望能够做到的是这样的:

  

在控制器中,我将传入一个C#对象,如下所示:

 public class Person { public string FirstName { get; set; } public string LastName { get; set; } //etc... } 

有没有办法扩展Controller类以通过一些正则表达式或其他行为来适应这种情况? 我讨厌我必须做这样的事情:

  

甚至这个:

  

思考?

您始终可以创建自己的模型绑定器。

这是一个实现支持向模型属性添加别名的绑定器的示例:

http://ole.michelsen.dk/blog/bind-a-model-property-to-a-different-named-query-string-field/

并通过它执行以下操作:

 [ModelBinder(typeof(AliasModelBinder))] public class Person { [BindAlias("first-name")] public string FirstName { get; set; } [BindAlias("last-name")] public string LastName { get; set; } //etc... } 

编辑:正如博客所说,这个实现基于Andras对以下SO问题的回答: Asp.Net MVC 2 – 将模型的属性绑定到不同的命名值

通过创建自定义表单值提供程序,您可以轻松解决此问题。 另一个优点是您可以通过装饰自定义属性来避免污染所有模型属性。

自订表格价值提供商

 public class DashFormValueProvider : NameValueCollectionValueProvider { public DashFormValueProvider(ControllerContext controllerContext) : base(controllerContext.HttpContext.Request.Form, controllerContext.HttpContext.Request.Unvalidated().Form, CultureInfo.CurrentCulture) { } public override bool ContainsPrefix(string prefix) { return base.ContainsPrefix(GetModifiedPrefix(prefix)); } public override ValueProviderResult GetValue(string key) { return base.GetValue(GetModifiedPrefix(key)); } public override ValueProviderResult GetValue(string key, bool skipValidation) { return base.GetValue(GetModifiedPrefix(key), skipValidation); } // this will convert the key "FirstName" to "first-name". private string GetModifiedPrefix(string prefix) { return Regex.Replace(prefix, "([az](?=[AZ])|[AZ](?=[AZ][az]))", "$1-").ToLower(); } } 

价值提供者工厂

 public class DashFormValueProviderFactory : ValueProviderFactory { public override IValueProvider GetValueProvider(ControllerContext controllerContext) { if (controllerContext == null) { throw new ArgumentNullException("controllerContext"); } return new DashFormValueProvider(controllerContext); } } 

的Global.asax.cs

 ValueProviderFactories.Factories.Add(new DashFormValueProviderFactory());