ASP.NET 5 MVC 6にはラジオボタンのタグヘルパーが表示されません。ラジオボタンを使用する必要があるフォーム要素を処理する正しい方法は何ですか?
ラジオボタンタイプも含むすべての入力タイプ用のTagHelperがあります。このようなビューモデルがあると仮定します
public class CreateUserVm
{
public string UserName { set; get; }
public IEnumerable<RoleVm> Roles { set; get; }
public int SelectedRole { set; get; }
}
public class RoleVm
{
public int Id { set; get; }
public string RoleName { set; get; }
}
そして、GETアクションで、
public IActionResult Index()
{
var vm = new CreateUserVm
{
Roles = new List<RoleVm>
{
new RoleVm {Id = 1, RoleName = "Admin"},
new RoleVm {Id = 2, RoleName = "Editor"},
new RoleVm {Id = 3, RoleName = "Reader"}
}
};
return View(vm);
}
ビューでは、入力タグにマークアップを使用できます。
@model YourNamespaceHere.CreateUserVm
<form asp-action="Index" asp-controller="Home">
<label class="label">User name</label>
<div class="col-md-10">
<input type="text" asp-for="UserName" />
</div>
<label class="label">Select a Role</label>
<div class="col-md-10">
@foreach (var item in Model.Roles)
{
<input asp-for="SelectedRole" type="radio" value="@item.Id" /> @item.RoleName
}
</div>
<input type="submit" />
</form>
フォームを投稿すると、選択したロールのRold IDはSelectedRole
プロパティにあります
上記のかみそりコードは、ループによって生成された各入力に対して同じId
属性値とname
属性値を持つ入力要素を生成することに注意してください。上記の例では、Id
およびname
属性値がSelectedRole
に設定された3つの入力要素(ラジオボタンタイプ)を生成します。モデルバインディングは、ビューモデルのプロパティ名(name
)と一致するSelectedRole
属性値として機能しますが、重複したId属性値により、クライアント側のコードで問題が発生する可能性があります(重複したId文書が無効です)
asp-for="SomeField"
を使用する解決策はありますが、最も簡単な解決策は、ビューモデルフィールドをラジオボタンのname
フィールドと一致させることであることがわかりました。
モデルを表示:
public class MyViewModel
{
public string MyRadioField { get; set; }
}
フォーム(わかりやすくするためにラベルなし):
@model MyViewModel
<form asp-action="SomeAction" asp-controller="SomeController">
<input type="radio" name="MyRadioField" value="option1" checked />
<input type="radio" name="MyRadioField" value="option2" />
<input type="radio" name="MyRadioField" value="option3" />
<input type="submit" />
</form>
フォームが送信されると、MyRadioField
にチェックされたラジオボタンの値が入力されます。