ASP.NET MVC模型表单名破折号绑定(ASP.NET MVC Model Binding wi

2019-07-30 02:36发布

我一直在网上淘试图找到一种方法,以适应从我的表单元素到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" />

思考?

Answer 1:

你总是可以创建自己的模型粘合剂。

下面是实现粘合剂是支持添加别名属性模特的例子:

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 -绑定模型的属性不同的命名值



Answer 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());


文章来源: ASP.NET MVC Model Binding with Dashes in Form Element Names