2013-02-16 13 views
6

Mam radiobuttonlistAby niestandardowy adapter działał, ale jeśli dane użytkownika zostaną zresetowane, a żadne dane nie zostały wcześniej przesłane, jeden z przycisków radiowych (pierwszy) jest zawsze wstępnie wybrany, I chcesz tego uniknąć, jak mogę to osiągnąć?ASP.NET MVC RadioButtonListFor jest zawsze ustawiony

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

oraz:

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

Dzięki!

+0

jak się czujesz na temat korzystania js? –

+1

To zawsze ostatnia deska ratunku ... – Baconbeastnz

+0

Sprawdź tego pomocnika, który jest pomocny w obsłudze radia od Darin http://stackoverflow.com/questions/9553408/custom-helper-for-generating-html-tags-for-radio-button-and -zaznaczony-label –

Odpowiedz

1

Właśnie próbował swoją metodę w szablonie mvc3 i wydaje się działać dobrze dla mnie. Zasadniczo mam utworzone w niektórych modelach

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

Następnie utworzony instancję i wypełnione wartości:

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

Biorąc Użyłem metodę rozszerzenie

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

wszystkie wydają perfekcyjnie po starcie . Pola nie są wybierane podczas ładowania i są usuwane po naciśnięciu przycisku "Reset".

enter image description here

można dać trochę więcej szczegółów, bo nie jestem pewien, czy w pełni zrozumieć, co starasz się osiągnąć :-)

EDIT:

Oto przykład w zwykły HTML przycisków radiowych. Na pewno nie są wypełnione na początku, a jeśli chcesz, aby były wymagane, dodaj wymagane, ale domyślnie możesz wysłać formularz bez wybierania żadnego przycisku radiowego. Możesz również sprawić, aby jeden został sprawdzony, dodając zaznaczone tak jak w drugim przykładzie. Czy używasz javascript po stronie klienta? Może to powoduje ten efekt uboczny? http://jsbin.com/isadun/1

mz

2

To jest Twój niestandardowy pomocnik z przyciskami, które nie są zaznaczone. Spróbuj tego, zakładam, że wyrenderuje wszystkie przyciski opcji niezaznaczone.

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

Dzięki, ale cholera to nie zadziałało :(! Weird! – Baconbeastnz

+1

Cholera! Leme pomyśl o innym podejściu –

+1

@Baconbeastnz, jedyną rzeczą, o której mogę pomyśleć, jest JS, ale o to źle się czuje –

1

Niestety Jeden przycisk wyboru musi być zawsze zaznaczony. To niefortunna część przycisków radiowych; jednak zawsze możesz dodać ukryty przycisk radiowy do formularza i ustawić właściwość checked na true; Niech twój wewnętrzny kod zaakceptuje wartość null lub cokolwiek innego, czego oczekujesz, jeśli nic z niej nie zostanie wybrane.

spróbuj ustawić wszystkie przyciski radiowe wartość do nierejestrowanego lub fałszywej

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

jeden przycisk radiowy musi być zawsze sprawdzony? To na pewno nie może być poprawne? – Baconbeastnz

+0

Przyciski radiowe wymagają, aby jedna była prawdą, ponieważ są one używane do wymuszenia na użytkownikach wybrania jednego z wyborów. Jeśli użyłeś pól wyboru i masz kod JS, który wyłączał inne pola, gdy je zaznaczono, wszystkie mogły być oznaczone jako fałszywe. Jeśli potrzebujesz jednego, który nie został wybrany, może to być lepsza implementacja. – Robert

+0

Mówię o stanie początkowym. Jestem pewna, że ​​możesz je odtajnić intonująco. Tak czy inaczej – Baconbeastnz

Powiązane problemy