web-dev-qa-db-ja.com

MVC 4 Razorの複数のラジオボタングループ

次のようにフォームに複数のラジオボタングループが必要です。
enter image description here

各グループに同じ "name" html属性を指定することで簡単に実行できることを知っています。
ただし
MVCでは、次のようなhtmlヘルパーを使用するときに独自の名前属性を指定できません。

@Html.RadioButtonFor(i => item.id, item.SelectedID, new { Name = item.OptServiceCatId })  

理由各タグの「name」属性(「id ")コントローラーが受け取るモデルにフォームをマップ/バインドするなど。

同じ「GroupName」属性でそれぞれを指定すると問題が解決するが、それも機能しなかったと言う人もいます。

だから、動作する方法はありますか?

編集:
これが私の見解です(簡略化):

@model Service_Provider.ViewModels.SelectOptServicesForSubServiceViewModel

@foreach (var cat in Model.OptServices)
{
  //A piece of code & html here
  @foreach (var item in cat.OptItems.Where(i => i.MultiSelect == false))
  {
     @Html.RadioButtonFor(i => item.id, item.SelectedID, new { GroupName = item.OptServiceCatId })
<br />
  }    
}

注:
私のモデルはList<OptServices>です:

public List<OptServices> Cats {get; set;}

また、OptServicesの内部にはList of OptItemsがあります。

public class OptServices
{
//a few things
public List<OptItems> Items {get; set;}
}
36
Ali

OKこれを修正する方法は次のとおりです

私のモデルはlist of categoriesです。各カテゴリには、サブカテゴリlistが含まれます。
これを念頭に置いて、foreachループのたびに、各RadioButtonにはname属性としてカテゴリのID(一意)があります。
そして、Html.RadioButtonの代わりにHtml.RadioButtonForも使用しました。

最終的な「動作する」擬似コードは次のとおりです。

@foreach (var cat in Model.Categories)
{
  //A piece of code & html here
  @foreach (var item in cat.SubCategories)
  {
     @Html.RadioButton(item.CategoryID.ToString(), item.ID)
  }    
}

結果は次のとおりです。

<input name="127" type="radio" value="110">

フォーム内にこれらのラジオボタングループをすべて配置したわけではないことに注意してください。そして、このソリューションがフォームで適切に機能するかどうかはわかりません。

これを解決してくれたすべての人々に感謝します;)

18
Ali

必要なのは、グループをモデル内の別のアイテムに関連付けることだけです

@Html.RadioButtonFor(x => x.Field1, "Milk")
@Html.RadioButtonFor(x => x.Field1, "Butter")

@Html.RadioButtonFor(x => x.Field2, "Water")
@Html.RadioButtonFor(x => x.Field2, "Beer")
28
Matt Bodily

SelectListからのテキスト/値のペアを使用してRadioButtonForを構築する同様の問題を修正しました。 ViewBagを使用してSelectListをビューに送信しましたが、モデルのデータも使用できます。私のWebアプリケーションはブログであり、彼が新しい投稿を書いているときに、いくつかの種類の記事でRadioButtonを作成する必要があります。

以下のコードは単純化されています。

List<SelectListItem> items = new List<SelectListItem>();

Dictionary<string, string> dictionary = new Dictionary<string, string>();

dictionary.Add("Texto", "1");
dictionary.Add("Foto", "2");
dictionary.Add("Vídeo", "3");

foreach (KeyValuePair<string, string> pair in objBLL.GetTiposPost())
{
    items.Add(new SelectListItem() { Text = pair.Key, Value = pair.Value, Selected = false });
}

ViewBag.TiposPost = new SelectList(items, "Value", "Text");

ビューでは、foreachを使用してラジオボタンを作成しました。

<div class="form-group">
    <div class="col-sm-10">
        @foreach (var item in (SelectList)ViewBag.TiposPost)
        {
            @Html.RadioButtonFor(model => model.IDTipoPost, item.Value, false)
            <label class="control-label">@item.Text</label>
        }

    </div>
</div>

フォームを送信した後、ユーザーがコントローラーで選択したオプションvalueをキャッチするためにRadioButtonForを使用していることに注意してください。 textオプションを表示するには、RadioButtonForの外側にitem.Textを配置する必要もありました。

役に立てば幸いです!

3
Marcelo Sader

辞書を使用して、牛乳、バター、チェスがグループA(リストA)であると想定します。水、ビール、ワインはグループBです

Dictonary<string,List<string>>) dataMap;
dataMap.add("A",ListA);
dataMap.add("B",ListB);

Viewでは、dataMapのキーをforeachしてアクションを処理できます

0
Dakota

私が取り組んでいるループの例で説明した名前属性を使用できましたが、おそらく一意のIDを作成したために機能しましたか?別の回答のリンクに記載されているように、代わりにエディターテンプレートに切り替えるべきかどうかを検討しています。

    @Html.RadioButtonFor(modelItem => item.Answers.AnswerYesNo, "true", new {Name = item.Description.QuestionId, id = string.Format("CBY{0}", item.Description.QuestionId), onclick = "setDescriptionVisibility(this)" }) Yes

    @Html.RadioButtonFor(modelItem => item.Answers.AnswerYesNo, "false", new { Name = item.Description.QuestionId, id = string.Format("CBN{0}", item.Description.QuestionId), onclick = "setDescriptionVisibility(this)" } ) No
0
Anna