2013-07-15 3 views
4

Я генерирую список радиокниг, а затем пытаюсь выбрать один из вариантов при загрузке, как показано ниже.Выбор по умолчанию в RadioButtonFor

цикл по каждому элементу в View

@foreach (var myListItem in Model.MyList) 
{ 
    @Html.RadioButtonFor(m => m.MyType,myListItem.MyType, new {id = myListItem.MyType, @Checked = (Model.MyTypeId == myListItem.MyTypeId) }) 
    @myListItem.MyType 
} 

Eventhough HTML, генерируется правильно (см ниже). Второй вариант проверяется вместо первого, даже когда Model.MyTypeId = 0.

Сгенерированный HTML для просмотра

<input id="0" name="MyType" value="Option One" CHECKED="True" type="radio">Option One 
<input id="1" name="MyType" value="Option Two " CHECKED="False" type="radio">Option Two  

Пожалуйста, подсказывают, как еще можно выбрать нужный вариант кнопки радио по умолчанию используется именно.

ответ

5

В настоящее время HTML неверен. Вам нужно сделать что-то больше вдоль этих линий:

@foreach (var myListItem in Model.MyList) 
{ 
    if (Model.MyTypeId == myListItem.MyTypeId) 
    { 
     @Html.RadioButtonFor(m => m.MyType,myListItem.MyType, 
      new 
      { 
       id = myListItem.MyType, 
       @Checked = "" 
      }) 
    } 
    else 
    { 
     @Html.RadioButtonFor(m => m.MyType,myListItem.MyType, 
      new 
      { 
       id = myListItem.MyType, 
      }) 
    } 
    @myListItem.MyType 
} 

Хотя я не могу проверить точный вывод, он должен выглядеть примерно так:

<input id="0" name="MyType" value="Option One" CHECKED type="radio"> 

Вы, возможно, придется использовать null для получить его, чтобы сгенерировать CHECKED без ="", но это тоже будет хорошо. См., Это не значение , которое признано, это атрибут сам, поэтому вот второй.

+0

Было бы лучше, если это можно сделать без if-else. – San

+0

Удостоверьтесь, что если у вас есть первая часть «For» правильно, она выберет ее при загрузке страницы из списка. – mmcrae

2

В любое время мне нужен список переключателей, созданных из запроса, я всегда использую этот метод RadioButtonListFor extension. Работает как шарм:

// jonlanceley.blogspot.com/2011/06/mvc3-radiobuttonlist-helper.html 
public static MvcHtmlString RadioButtonListFor<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(); 
    sb.Append("<span class='RadioButtonListFor'> "); 

    if (listOfValues != null) 
    { 
     // Create a radio button for each item in the list 
     foreach (SelectListItem item in listOfValues) 
     { 
      // Generate an id to be given to the radio button field 
      var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value); 

      // Create and populate a radio button using the existing html helpers 

      var htmlAttributes = new Dictionary<string, object>(); 
      htmlAttributes.Add("id", id); 

      if (item.Selected) 
       htmlAttributes.Add("checked", "checked"); 

      var radio = htmlHelper.RadioButtonFor(expression, item.Value, htmlAttributes); 


      // Create the html string that will be returned to the client 
      // e.g. <label<input data-val="true" data-val-required="You must select an option" id="TestRadio_1" name="TestRadio" type="radio" value="1" />Line1</label> 
      sb.AppendFormat("<label>{0} {1}</label> ", radio, HttpUtility.HtmlEncode(item.Text)); 
     } 
    } 

    sb.Append(" </span>"); 
    return MvcHtmlString.Create(sb.ToString()); 
} 

Теперь вы можете создавать свои Radio Buttons из любой коллекции у вас есть в памяти, как правило, в качестве свойства на вашей ViewModel, как это:

public int SelectedPaymentMethodId { get; set; } 

public IEnumerable<SelectListItem> PaymentMethodChoices 
{ 
    get 
    { 
      return from x in dataSourceFoo 
       select new SelectListItem { 
         Text = x.TextThing, Value = x.Id, Selected = (x.Id == SelectedPaymentMethodId) 
        }; 
    } 
} 

И Ваше мнение, как простой как:

@Html.RadioButtonListFor(model => model.SelectedPaymentMethodId, Model.PaymentMethodChoices) 
Смежные вопросы