2012-06-23 8 views
10

Form öğelerimden gelen çizgilere, MVC 2, 3'teki ASP.NET Denetleyicilerinin varsayılan model bağlama davranışına uyum sağlamanın bir yolunu bulmaya çalışırken internette araştırma yapıyordum. hatta bir ön uç geliştirici olarak, camel Case veya alt çizgi üzerinde CSS'mdeki tire işaretlerini tercih ederim.Form Öğesi Adlarındaki Tire'lerle ASP.NET MVC Modeli Bağlama

<input type="text" name="first-name" class="required" /> 
<input type="text" name="last-name" class="required" /> 

kontrolörü, ben bir C# nesnesinde geçirmeden olacağını şu şekilde görünecektir:

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

benim biçimlendirme, ben hiç böyle bir şey yapabilmek için ne istiyor Controller sınıfını, bazı normal ifadelerle veya başka bir davranışla karşılamak için genişletmenin bir yolu var mı?

<input type="text" name="person.firstname" class="required" /> 

hatta bu:

<input type="text" name="isPersonAttending" class="required" /> 

Düşünceler Ben böyle bir şey yapmak zorunda gerçeğinden nefret ediyorum?

+1

cevabımı dikkate Model özellik adlarını kısaltmakla ilgili kendi sorularım için http://stackoverflow.com/questions/4316301/asp-net-mvc-2-bind-a-models-property-to-a-different -sayılı-değer # answer-4316327 –

cevap

6

Her zaman kendi model birleştiricinizi oluşturabilirsiniz.

İşte özelliklerini modellemek için diğer adlar ekleyerek destekler bir bağlayıcı uygulayan bir örnek:

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

DÜZENLEME:

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

Ve böyle bir şey yapmak ile Bu uygulama, Blogger'ın dediği gibi, Andras'ın şu SO sorusunun cevabını temel alır: Asp.Net MVC 2 - Bind a model's property to a different named value

+1

, blog yazarı dediği gibi, bu nedenle, ve bu nedenle, kendi yanıtımın bir kopyası olduğunu lütfen unutmayın: http://stackoverflow.com/questions/4316301/asp-net- mvc-2-bind-a-modelleri-özellik-bir-farklı-adlandırılmış-değer # answer-4316327 –

+0

Bu mantıksal ve büyük bir anlam ifade eder. Teşekkürler! –

+0

Andras, tamamen haklısınız, cevabınızı referans görmemiştim. Bunun için üzgünüm. Btw, harika bir uygulama. –

3

Özel biçim değer sağlayıcısı oluşturarak bu sorunu kolayca çözebilirsiniz. Diğer avantajı ise, özel nitelikler oluşturarak tüm model özelliklerini kirletmekten kaçınmanızdır.

Özel Form Değer Sağlayıcı

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

Değer Sağlayıcı Fabrikası

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

Güzel! Sizinle aynı fikirdeyim - form öğenizin adlarının çoğu için tire kullanıyorsanız, öznitelikleri kullanmak biraz fazla olur. Paylaştığın için teşekkürler! –

+0

Utanarak çalıştım. –