2012-06-23 7 views
10

フォーム要素のダッシュをMVC 2、3、および4のASP.NETコントローラのデフォルトのモデルバインディング動作に変換する方法を見つけるために、またはさらに4です。フォーム要素名にダッシュを付けたASP.NET MVCモデルのバインド

フロントエンドの開発者として、私はcamelCaseまたは下線よりも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" /> 

思考私はこのような何かをしなければならないという事実を嫌い?

+1

私の答えを考えますモデルのプロパティ名を短縮する方法についての私自身の質問に、エイリアスを付ける方法を示します。http://stackoverflow.com/questions/4316301/asp-net-mvc-2-bind-a-models-property-to-a-different -named-value#answer-4316327 –

答えて

6

独自のモデルバインダーをいつでも作成できます。 、 この実装:

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... 
} 

EDITをここで

は、プロパティをモデル化するためにエイリアスを追加サポートバインダーを実装例ですブロガーが言うように、以下のSO質問に関するAndrasの答えに基づいています: Asp.Net MVC 2 - Bind a model's property to a different named value

+1

ブログの作者が言うように、それはしたがって、これは私自身の答えのコピーです:http://stackoverflow.com/questions/4316301/asp-net- mvc-2-bind-a-models-other-named-valueと異なる##答え-4316327 –

+0

これは論理的であり、理にかなっています。ありがとう! –

+0

Andras、あなたは完全に正しいです、私はあなたの答えへの参照を見ていない。申し訳ありません。ところで、素晴らしい実装。 –

3

カスタムフォーム値プロバイダを作成することで、この問題を簡単に解決できます。もう1つの利点は、カスタム属性を装飾することによって、すべてのモデルプロパティを汚染することを避けることができるということです。

カスタムフォーム値プロバイダー

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()); 
+0

ニース!私はあなたに同意するだろう - ほとんどのフォーム要素名にダッシュを使用していた場合、属性を使用すると多少なりともなります。シェアしてくれてありがとう! –

+0

すごくうまくいった。 –

関連する問題