2013-02-16 3 views
6

Ich habe eine radiobuttonlistFor benutzerdefinierten Adapter funktioniert, aber wenn ein Benutzer Formular Daten zurückgesetzt wird, und keine Daten zuvor übermittelt wurde, ist eine der Optionsfelder (die erste) immer vorgewählt, ich will das vermeiden, wie kann ich das erreichen?ASP.NET MVC RadioButtonListFor ist immer voreingestellt

@Html.RadioButtonForSelectList(model => model.ViewModelForThingCreate.ThingTypeID, Model.ViewModelForCarCreate.CarTypeSelectList) 

und:

public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(this HtmlHelper<TModel> HTMLHelper,Expression<Func<TModel, TProperty>> Expression, IEnumerable<SelectListItem> ListOfValues) 
     { 
      var MetaData = ModelMetadata.FromLambdaExpression(Expression, HTMLHelper.ViewData); 
      var SB = new StringBuilder(); 

      if (ListOfValues != null) 
      { 
       foreach (SelectListItem Item in ListOfValues) 
       { 
        var ID = string.Format("{0}_{1}", MetaData.PropertyName, Item.Value); 
        var Radio = HTMLHelper.RadioButtonFor(Expression, Item.Value, new { id = ID }).ToHtmlString(); 
        SB.AppendFormat("<label class=\"radio inline\" for=\"{0}\">{1} {2}</label>", ID, Radio, HttpUtility.HtmlEncode(Item.Text)); 
       } 
      } 
      return MvcHtmlString.Create(SB.ToString()); 
     } 

Dank!

+0

, wie fühlen Sie sich über js verwenden? –

+1

Das ist immer der letzte Ausweg ... – Baconbeastnz

+0

Schauen Sie sich diese Slick-Radio-Taste Helfer von Darin http://Stackoverflow.com/questions/9553408/custom-helper-for-generating-html-tags-for-radio-button-and -associated-label –

Antwort

1

habe ich versucht, einfach Ihre Methode in MVC3 Vorlage und es scheint gut für mich zu arbeiten. Im Grunde habe ich erstellt einige Modelle

public class IndexModel 
{ 
    public string ID; 
    public IEnumerable<SelectListItem> Elements; 
} 

Dann erstellte Instanz und gefüllt Werte:

var model = new IndexModel() 
      { 
       ID = "a", 
       Elements = 
         new List<SelectListItem>() { 
                new SelectListItem() { Text = "test1", Value = "1"}, 
                new SelectListItem() { Text = "test2", Value = "2"}} 
      }; 

Im Hinblick ich Ihre Erweiterungsmethode

<form> 
@(Extensions.RadioButtonForSelectList(Html, x => x.ID, Model.Elements)) 
<button type="reset">Reset</button> 
</form> 

Alles völlig in Ordnung scheint verwendet habe, nach dem Start . Felder werden beim Laden nicht ausgewählt und nach dem Drücken der Schaltfläche "Zurücksetzen" gelöscht.

enter image description here

Können Sie einige weitere Details geben, wie ich bin nicht sicher, ob ich voll und ganz verstehen, was Sie :-)

EDIT zu erreichen versuchen:

Hier ist Beispiel im Klar HTML der Optionsfelder. Sie sind definitiv nicht am Anfang gefüllt und wenn Sie möchten, dass sie erforderlich sind, fügen Sie erforderlich aber standardmäßig können Sie Formular ohne Auswahl eines Radio-Button senden. Sie können auch eine Überprüfung vornehmen, indem Sie wie im zweiten Beispiel überprüft hinzufügen. Verwenden Sie Javascript auf der Client-Seite? Vielleicht verursacht es diesen Nebeneffekt? http://jsbin.com/isadun/1

mz

2

Dies ist Ihr benutzerdefinierter Helfer, dessen Schaltflächen nicht aktiviert sind. Versuchen Sie dies, ich nehme an, es wird alle Optionsfelder deaktiviert.

public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(this HtmlHelper<TModel> HTMLHelper,Expression<Func<TModel, TProperty>> Expression, IEnumerable<SelectListItem> ListOfValues) 
     { 
      var MetaData = ModelMetadata.FromLambdaExpression(Expression, HTMLHelper.ViewData); 
      var SB = new StringBuilder(); 

      if (ListOfValues != null) 
      { 
       foreach (SelectListItem Item in ListOfValues) 
       { 
        var ID = string.Format("{0}_{1}", MetaData.PropertyName, Item.Value); 
        var Radio = HTMLHelper.RadioButtonFor(Expression, Item.Value, new { id = ID }).ToHtmlString(); 
        SB.AppendFormat("<label class=\"radio inline\" checked="false" for=\"{0}\">{1} {2}</label>", ID, Radio, HttpUtility.HtmlEncode(Item.Text)); 
       } 
      } 
      return MvcHtmlString.Create(SB.ToString()); 
     } 
+0

Danke aber verdammt noch mal, es hat nicht funktioniert :(! Seltsam! – Baconbeastnz

+1

Verdammt! Leme denke über einen anderen Ansatz –

+1

@Baconbeastnz, die einzige andere Sache, die ich mir vorstellen kann ist JS. Aber das fühlt sich falsch –

1

Leider muss immer ein Optionsfeld überprüft werden. Das ist der unglückliche Teil über Radioknöpfe; Sie können jedoch Ihrem Formular immer ein ausgeblendetes Optionsfeld hinzufügen und die Eigenschaft checked auf true setzen. Lassen Sie Ihren internen Code eine Null annehmen oder was auch immer Sie erwarten, wenn nichts davon ausgewählt wird.

versuchen, alle die Radio-Buttons Wert zu unkontrolliert oder falsche Einstellung

foreach(button in ButtonGroup){ 
button.checked = false; 
} 
+0

ein Radio-Button muss immer überprüft werden? Das kann nicht stimmen, sicher? – Baconbeastnz

+0

Optionsfelder erfordern, dass eine wahr ist, da sie dazu verwendet werden, den Benutzer zur Auswahl einer Auswahl zu zwingen. Wenn Sie Kontrollkästchen aktiviert haben und über JS-Code verfügen, der die anderen Felder deaktiviert, wenn eines ausgewählt ist, können Sie alle als falsch markieren. Wenn Sie eine nicht ausgewählt haben, dann könnte das eine bessere Implementierung sein. – Robert

+0

Ich spreche über den Ausgangszustand. Ich bin sicher, dass Sie sie anfänglich nicht ausgewählt haben können. Egal – Baconbeastnz