2009-08-20 7 views
28

Ich habe gelernt, few minutes ago, dass das Hinzufügen von Datenattribute ist eine nette Möglichkeit, benutzerdefinierte Informationen zu HTML-Elementen hinzuzufügen. Also habe ich versucht, so zu tun:Wie Sie Datenattribute zum HTML-Element in ASP.NET MVC hinzufügen?

<%= Html.TextBox ("textBox", "Value", new { data-myid = m.ID })%> 

Aber es endet als Syntaxfehler. Wie kann ich benutzerdefinierte Datenattribute definieren?

EDIT:

Ich sehe, dass ich mit diesem Effekt erreichen kann:

<%= Html.TextBox ("textBox", "Value", new Dictionary<string, object> {{ "data-myid", m.ID }})%> 

Aber das sieht nicht ... umm ... sauber! Gibt es einen besseren Weg, dies zu tun?

+0

Sehen Sie diese Frage ‚Gekoppelte HTML-Attribute mit asp.net MVC‘ http://stackoverflow.com/questions/2897733/hyphenated-html-attributes-with-asp-net-mvc/12091886#12091886 –

+0

Anmerkung: die neueren Die richtige Antwort lautet http: // stackoverflow.com/a/5872576/1037948, weiter unten auf dieser Seite, wenn Sie nicht gerne scrollen;) – drzaus

Antwort

103

Verwenden Sie ein statt einem Bindestrich unterstreichen.

new { data_myid = m.ID }

Diese definitiv in MVC3 arbeitet (überprüft nicht andere Versionen). Der Unterstrich wird in einen Bindestrich konvertiert, wenn der HTML-Code gerendert wird.

+0

Danke, das funktioniert – shatl

+6

Funktioniert auch in MCC 4. – Ryan

+3

sollte dies auf jeden Fall die Antwort markiert werden :) – benpage

-2
<%= Html.TextBox ("myTextBox", "", 
     new { @class="redText", title="Enter red text here"})%> 

Ergebnisse in:

<input type="text" id="myTextBox" class="redText" title="Enter red text here" /> 

bin ich nicht sicher, was das Problem ist. Könnte etwas mit dem "-" im Eigenschaftsnamen Ihres anonymen Typs zu tun haben.


Ja, der Compiler mag Ihren Attributnamen nicht. Um HTML5-Datenattribute hinzuzufügen, müssen Sie aus den Kommentaren das Wörterbuch verwenden oder eine andere Erweiterung erstellen, die die Konstruktion der Wörterbücher vereinfacht.

+0

Wie definiert dieser Code das Attribut "data-myid" in der Textbox? – Hemant

+0

Warum * willst du * ein ungültiges Attribut in deinen HTML-Code schreiben? – Will

+1

der Compiler mag nicht den Bindestrich in einem Objektschlüssel – redsquare

0

Ich denke, Sie müssen Ihren eigenen Helfer erstellen, um dies für Sie zu tun. Ich finde keinen Weg, dies direkt in der Ansicht zu tun.

5

Ich kann keine Möglichkeit sehen, eine anonyme Typdeklaration zu akzeptieren data-myid, da das ist kein gültiger Eigenschaftenname in C#. Eine Möglichkeit wäre, eine neue Überlastung zu schaffen, die einen zusätzlichen dataAttributes Parameter übernimmt, und prepends data- den Namen für Sie ...

using System.ComponentModel; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 
using System.Web.Routing; 

static class TextBoxExtensions 
{ 
    public static string TextBox(this HtmlHelper htmlHelper, string name, object value, object htmlAttributes, object dataAttributes) 
    { 
     RouteValueDictionary attributes = new RouteValueDictionary(htmlAttributes); 
     attributes.AddDataAttributes(dataAttributes); 

     return htmlHelper.TextBox(
      name, 
      value, 
      ((IDictionary<string, object>)attributes); 
    } 

    private static void AddDataAttributes(this RouteValueDictionary dictionary, object values) 
    { 
     if (values != null) 
     { 
      foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(values)) 
      { 
       object obj2 = descriptor.GetValue(values); 
       dictionary.Add("data-" + descriptor.Name, obj2); 
      } 
     } 

    } 
} 

Dann können Sie ein data-myid Attribut mit

<%= Html.TextBox ("textBox", "Value", 
     new { title = "Some ordinary attribute" }, 
     new { myid = m.ID }) %> 

fügen jedoch Das lässt Sie diese Überladung für alle anderen Methoden erstellen, die Sie Datenattribute akzeptieren möchten, was ein Schmerz ist. Sie könnten um das erhalten, indem die Logik zu einem es

public static IDictionary<string,object> MergeDataAttributes(
    this HtmlHelper htmlHelper, 
    object htmlAttributes, 
    object dataAttributes) 

bewegen und rufen als

<%= Html.TextBox ("textBox", "Value", 
     Html.MergeDataAttributes(new { title = "Some ordinary attribute" }, new { myid = m.ID })) %> 
Verwandte Themen