2012-04-09 10 views
1

Ich möchte ein Modell erstellen:Benutzerdefinierte HTML-Attribute in MVC3 Modell

public class TestModel 
{ 
    Microdata(Data = "data-test=this is a test!")] 
    public bool Test { get; set; } 
} 

Dann in der Ansicht:

@Html.DisplayForModel() 

Das Ergebnis i gesucht habe, ist so etwas wie dieses:

<label>Test:</label> <input type="checkbox" data-test="this is a test!" /> 

Ich habe bereits eine benutzerdefinierte Attributklasse erstellt, aber das hat nichts erzeugt.

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 
public class MicrodataAttribute : Attribute 
{ 
    public string Data { get; set; } 

    public RouteValueDictionary GetAttributes() 
    { 
     var attributes = new RouteValueDictionary(); 

     if (this.Data != null) 
     { 
      string[] kv = this.Data.Split(','); 
      attributes.Add(kv[0], kv[1]); 
     } 
     return attributes; 
    } 
} 



public class MetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) 
    { 
     var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 
     var additionalValues = attributes.OfType<HtmlPropertiesAttribute>().FirstOrDefault(); 
     if (additionalValues != null) 
     { 
      metadata.AdditionalValues.Add("HtmlAttributes", additionalValues); 
     } 
     return metadata; 
    } 
} 

Antwort

2

Warum sollte es? Es gibt keinen Code, der das Attribut verwendet ...

Lesen Sie den Blog-Post unten - es wird beschrieben, wie MVC-Metadaten verwendet und ein Beispiel für eine benutzerdefinierte object Vorlage werden Sie schreiben müssen:

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

+0

Ich verstehe nicht, was Sie meinen, wenn Sie sagen, dass es keinen Code gibt, der mein Attribut verwendet ?? Der ganze Sinn der Verwendung von Modellen in MVC ist die Modellierung Ihrer Datenbank oder Ansicht oder was auch immer für Ihre Anwendung. Diese Modelle werden dynamisch erstellt und sehen genauso aus. Außerdem muss ich benutzerdefinierte HTML5-Datenstrichattribute verwenden. –

+0

@JasonFoglia - Kein Code im MVC-Framework verwendet das Attribut 'HtmlProperties'. –

+0

Wie ist dies möglich, wenn eine Datenvalidierung mit html5 Datenstrichattributen durchgeführt wird? ex: data-val Gibt es keine Möglichkeit, die Datenvalidierung zu manipulieren? Wie Sie bereits wissen, gibt es einen Weg, dies zu tun. Sie haben mir einen Link geschickt, hier ist ein anderer http://ruijarimba.wordpress.com/2011/07/24/asp-net-mvc-add-html5-microdata-to-your-applications-using-metadata-providers/ –

0

Nachdem er das Problem mit @JakubKonecki besprochen und den Blogbeitrag gelesen hatte, präsentierte er. Hier ist mein EditTemplate, das verwendet wird, um Datenstrichattribute in MVC 2/3 zu erstellen und höchstwahrscheinlich 4.

Ich habe diese Datei unter root/Views/Shared/EditTemplates als String.cshtml gespeichert. cshtml, da ich die Rasiermessermaschine benutze. Der Standort kann unterschiedlich sein, wenn Sie Area's verwenden und diese nicht im Ordner "Gemeinsame Ansichten" gespeichert werden müssen. Lesen Sie einfach den gesamten Blog @JakubKonecki von Brad Wilson gepostet.

Danke nochmal @JakubKonecki!

@{ 
    Dictionary<string, object> AV = ViewData.ModelMetadata.AdditionalValues; 
    Dictionary<string, object> htmlAttr = new Dictionary<string,object>(); 
    foreach (KeyValuePair<string, object> A in AV) 
    { 
     if (A.Value is System.Web.Routing.RouteValueDictionary) 
     { 
      foreach (KeyValuePair<string, object> B in (System.Web.Routing.RouteValueDictionary)A.Value) 
      { 
       htmlAttr.Add(B.Key, B.Value); 
      } 
     } 
    } 
    htmlAttr.Add("class", "text-box single-line"); 
    htmlAttr.Add("type", "text"); 
} 

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, htmlAttr) 
Verwandte Themen