我一直在网上淘试图找到一种方法,以适应从我的表单元素到MVC 2,3,甚至4 ASP.NET的控制器的默认模型绑定行为破折号。
作为前端开发人员,我喜欢在我的CSS在驼峰或下划线破折号。 在我的标记,我想做什么就能做的是这样的:
<input type="text" name="first-name" class="required" />
<input type="text" name="last-name" class="required" />
在控制器中,我将传递一个C#对象,它应该是这样的:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
//etc...
}
是否有某种方式来扩展Controller
类通过一些正则表达式或其他行为,以适应这一点? 我恨,我必须做这样的事情的事实:
<input type="text" name="person.firstname" class="required" />
甚至是这样的:
<input type="text" name="isPersonAttending" class="required" />
思考?
你总是可以创建自己的模型粘合剂。
下面是实现粘合剂是支持添加别名属性模特的例子:
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...
}
编辑:此实现,作为博客说,是基于安德拉什以下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, "([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))", "$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());