2012-06-23 5 views
10

Ich habe das Internet durchsucht, um einen Weg zu finden, Bindestriche aus meinen Formularelementen in das Standardmodell Bindungsverhalten von ASP.NET-Controllern in MVC 2, 3 aufzunehmen, oder sogar 4.ASP.NET MVC Model Binding mit Bindestrichen in Formularelementnamen

Als Front-End-Entwickler, bevorzuge ich Bindestriche in meinem CSS über CamelCase oder Unterstriche. In meinem Markup, was möchte ich in der Lage sein zu tun, um so etwas zu ist:

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

In der Steuerung, würde ich in einem C# Objekt übergeben werden, die wie folgt aussehen:

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

Gibt es eine Möglichkeit, die Klasse Controller durch einige Regex- oder andere Verhaltensweisen zu erweitern? Ich hasse die Tatsache, dass ich so etwas zu tun haben:

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

oder sogar unter:

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

Gedanken?

+1

betrachten meine Antwort zu meiner eigenen Frage über das Verkürzen von Modelleigenschaftsnamen, wo ich zeige, wie man sie alias http://stackoverflow.com/questions/4316301/asp-net-mvc-2-bind-a-model-property-to-a-different -named-value # answer-4316327 –

Antwort

6

Sie können immer Ihr eigenes Modellbinder erstellen.

Hier ist ein Beispiel, das ein Bindemittel implementiert, die Aliases Hinzufügen unterstützt Eigenschaften zu modellieren:

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

Und damit so etwas wie:

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

EDIT: Diese Implementierung, wie der Blogger sagt, basiert auf Andras Antwort auf die folgende SO Frage: Asp.Net MVC 2 - Bind a model's property to a different named value

+1

Bitte beachten Sie, dass, wie der Blog-Autor sagt, das, und daher dies, eine Kopie meiner eigenen Antwort hier ist: http://stackoverflow.com/questions/4316301/asp-net- mvc-2-bind-a-models-property-to-a-anders-named-value # answer-4316327 –

+0

Das ist logisch und macht Sinn. Vielen Dank! –

+0

Andras, Sie sind völlig richtig, ich hatte den Hinweis auf Ihre Antwort nicht gesehen. Das tut mir leid. BTW, tolle Umsetzung. –

3

Durch Erstellen eines benutzerdefinierten Formularwertanbieters können Sie dieses Problem problemlos lösen. Der andere Vorteil besteht darin, dass Sie vermeiden können, alle Modelleigenschaften zu verschmutzen, indem Sie benutzerdefinierte Attribute dekorieren.

Custom Form Wert Provider

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

Wert Provider Fabrik

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

Schön! Ich würde Ihnen zustimmen - wenn Sie für die meisten Ihrer Formularelementnamen Bindestriche verwenden würden, wäre die Verwendung von Attributen ein bisschen viel. Danke für die Aktie! –

+0

Wirklich funktioniert. –