2009-03-09 6 views
2

Gibt es eine einfache Möglichkeit, die vorhandenen Html-Helfer zu verwenden, um eine Liste von Checkboxen mit expliziten Werten zu generieren (wie es in Beta möglich war)?ASP.NET MVC RC2 - Checkboxen mit expliziten Werten

Beispiel in Beta (möglicherweise mit MVC Contrib):

.CheckBox("Field", 6, new { value = 6}) Ausgang würde:

<input id="Field1" type="checkbox" value="6" name="Field" /> 
<input id="Field2" type="hidden" value="6" name="Field" /> 

noch in RC2 ich:

<input id="Field1" type="checkbox" value="6" name="Field" /> 
<input type="hidden" value="false" name="Field" /> 

NB: Ich benutze eine benutzerdefinierte Helfer Erweiterung , die einzigartige HTML id s und erzeugt s das aufgegebene HTML-Attribut, wenn entsprechenden

Neben rohen HTML und nicht mit Hilfe von HTML-Helfer verwendet, ist es eine Möglichkeit, von Kontrollkästchen mit expliziten Werte einstellen? Wenn man sich den CodePlex-Quellcode für RC2 anschaut, scheint es kein einfacher Weg zu sein, da .InputHelper() mit private gekennzeichnet ist, so dass Sie es nicht verwenden können, um zu helfen.

NB: Es gibt mehr als eine checkbox auf der Seite Mehrfachauswahl zu ermöglichen, so dass der false Wert ist zwecklos, da ich die Werte aus dem verborgenen Bereich muß wissen, welche Elemente aktiviert wurde und welche nicht (wie nicht überprüfte checkbox Werte werden nicht veröffentlicht - nur die ausgeblendeten Felder sind).

Antwort

0

Als Abhilfe, die ich gekommen bin oben mit der Basis folgenden lose auf dem InputHelper Methode des RC2 Sourcecode, aber es angepasst mehr Werte zu ermöglichen:

 
private static string CheckBoxWithValue(this HtmlHelper htmlHelper, string name, object value, bool isChecked, bool setId, IDictionary htmlAttributes) 
     { 
      const InputType inputType = InputType.CheckBox; 
      if (String.IsNullOrEmpty(name)) 
      { 
       throw new ArgumentException("null or empty error", "name"); 
      } 

      var tagBuilder = new TagBuilder("input"); 
      tagBuilder.MergeAttributes(htmlAttributes); 
      tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType)); 
      tagBuilder.MergeAttribute("name", name, true); 
      string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture); 

      if (isChecked) 
      { 
       tagBuilder.MergeAttribute("checked", "checked"); 
      } 
      tagBuilder.MergeAttribute("value", valueParameter, true); 
      if (setId) tagBuilder.GenerateId(name); 

      // If there are any errors for a named field, we add the css attribute. 
      ModelState modelState; 
      if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) 
      { 
       if (modelState.Errors.Count > 0) 
       { 
        tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); 
       } 
      } 
      var inputItemBuilder = new StringBuilder(); 
      inputItemBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing)); 

      var hiddenInput = new TagBuilder("input"); 
      hiddenInput.MergeAttributes(htmlAttributes); 
      hiddenInput.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden)); 
      hiddenInput.MergeAttribute("name", name); 
      if (setId) 
      { 
       hiddenInput.GenerateId(name); 
      } 
      hiddenInput.MergeAttribute("value", valueParameter); 

      inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing)); 
      return inputItemBuilder.ToString(); 

     } 

Dies beruht auf .ToString(), um das Objekt der auswerten Wert, aber ist für mein Szenario angemessen, wo ich Ganzzahlen verwende, um Optionen mit der Suche in der Back-End-Datenbank zu repräsentieren. Beachten Sie, dass der boolesche Wert von setId scheinbar nur Punkte im HTML-Namen durch Unterstriche ersetzt. Wenn Sie mehrere Kontrollkästchen in HTML verwenden, sollten die IDs eindeutig sein, sodass ich einfach die eindeutige ID über die htmlAttributes-Sammlung übergebe.

+0

Ich habe dies in eine andere öffentliche Hilfsmethode verpackt, um den isChecked Value von modelstate/viewdata zu setzen, falls Sie sich fragen, warum dies als privat markiert ist. –

0

Wenn die Eigenschaft, zu der das Feld gehört, vom Typ Int ist, wird false in 0 konvertiert, denke ich.

So wissen Sie, wie die Box geprüft wurde oder nicht.

0

Wenn Sie vor kurzem von "normalem" ASP.Net gegangen sind und angefangen haben, MVC zu verwenden, dann sind Sie vielleicht sehr daran interessiert, nicht gerade HTML zu schreiben, aber in der MVC-Welt ist es kein Problem, da es keine gibt längerer Viewstate und andere Probleme, mit denen zu kämpfen ist. Also, zögern Sie nicht, einfach nur HTML zu verwenden, wenn Sie möchten, besonders wenn Sie nur mit Ganzzahlen zu tun haben (brauchen Sie sich keine Gedanken über Javascript-Injection oder irgendetwas zu machen).

Verwandte Themen