4

ラジオボタン リストを生成し、ロード時に次のように 1 つのオプションを選択しようとしています。

ビューの foreach ループ

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

HTML は正しく生成されますが (以下を参照)。の場合でも、1 番目の代わりに 2 番目のオプションがチェックされます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    

デフォルトで目的のラジオボタンオプションを選択する方法を他に提案してください。

4

2 に答える 2

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に を生成するには、を使用する必要があるかもしれませんが、それも問題ありません。ほら、認識されるのは値ではなく、属性自体なので、2番目のものがチェックされるのはそのためです。CHECKED=""

于 2013-07-15T12:03:57.250 に答える
2

クエリから作成されたラジオ ボタンのリストが必要なときはいつでも、この RadioButtonListFor 拡張メソッドにアクセスします。魅力のように機能します:

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

これで、メモリ内にある任意のコレクションから、通常は次のように 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)
于 2013-07-15T12:38:35.540 に答える