2016-07-19 33 views
2

私は、ラジオボタンタグヘルパーのvalue属性を使用して、ボタンがチェックされているかどうかを通知する方法を探していました。選択するために別のフィールドを使用するのではなく、 @Shyjuさんの回答がrelated questionにありました。私は、その答えの修正された例を使って、私が意味することを示しています。htmlでラジオボタンのタグヘルパー値の属性を "checked"に設定することはできますか?

のは、私はこれを達成したい何を、私はのviewmodel

public class ExampleViewModel 
{ 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public List<UserRole> Roles { get; set; } 
} 
public class UserRole 
{ 
    public int Id { get; set; } 
    public string RoleName { get; set; } 
    public bool IsSelected { get; set; } 
} 
コントローラに初期化され

public IActionResult Example() 
    { 
     var vm = new ExampleViewModel 
     { 
      Roles = new List<UserRole> 
      { 
       new UserRole {Id = 1, RoleName = "Admin"}, 
       new UserRole {Id = 2, RoleName = "Editor"}, 
       new UserRole {Id = 3, RoleName = "Reader"} 
      } 
     }; 
     return View("Example",vm); 
    } 

とビューで使用

<form asp-controller="Example" asp-action="Save"> 
    <label class="label">User name</label> 
    <div class="col-md-10"> 
     <input asp-for="UserName" type="text" /> 
    </div> 
    <label class="label">Select a Role</label> 
    <div class="col-md-10"> 
     <div class="btn-group" data-toggle="buttons"> 
      @for (var i = 0; i < Model.Roles.Count; i++) 
      { 
       <label class="btn btn-default"> 
        <input asp-for="Roles[i].Id" type="radio" value="@Model.Roles[i].Id" /> 
        <input asp-for="Roles[i].IsSelected" type="radio" value=true /> 
        @Model.Roles[i].RoleName 
       </label> 
      } 
     </div> 
    </div> 
    <input type="submit" /> 
</form> 

を持っているとしましょうコントローラのpostメソッドのUserRole.IsSelectedフィールドを読み取って、特定のUserRoleが存在するかどうかを確認するチェックされているかどうか。このソリューションは、ユーザーが1つのボタンだけをチェックし、選択肢を変更しない場合に機能します。ユーザーが選択を別のものに変更すると、ユーザーがタッチしたすべてのUserRole値には、IsSelectedフィールドがtrueになります。

フォームを送信したときにチェックされるボタンまたはJavaScript関数が必要なボタンだけを表示するように、HTMLでIsSelected値を何とか設定することはできますか?

答えて

3

あなたのモデルは、ラジオボタン(多くのラジオボタンを1つ選択するためのもの)には意味がありません。あなたが唯一の役割を選択したい場合は、あなたのモデルは

public class ExampleViewModel 
{ 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public int SelectedRole { get; set; } 
    public List<UserRole> RolesList { get; set; } 
} 
public class UserRole 
{ 
    public int Id { get; set; } 
    public string RoleName { get; set; } 
} 

である必要があり、ビューに

@foreach(var role < Model.RolesList) 
{ 
    <label class="btn btn-default"> 
     <input asp-for=SelectedRole" type="radio" value="role.Id" /> 
     <span>@role.RoleName<span> 
    </label> 
} 

とPOSTメソッドで

は、 SelectedRoleの値は、選択の Idが含まれています UserRole

代わりもし、あなたが複数の役割、使用既存のモデルを選択したいのですが、ビューは

なり、

とPOSTメソッドでは、あなたが

IEnumerable<UserRole> selectedRoles = model.Roles.Where(x => x.IsSelected); 
+0

おかげでスティーブンを使用して、選択したロールを得ることができ、あなたの答えは非常に明確かつ有益です。私は、ビューで動的に選択基準を設定できるソリューションを開発しようとしています。時々、選択は排他的なもの(ラジオボタン)のみであり、時には複数の選択肢が許可される(チェックボックス)。私は両方の場合で同じモデルを使うことができました。私はそれが不可能かもしれないと感じていたが、私は確信してここにそれを求めるだろうと思った。 – Yuhis

+0

全くありません。それはおそらくちょっと正確すぎる私の質問には良い答えでした。暗黙のうちにそれは私の問題を解決しました。 – Yuhis

+0

@StephenMuecke私の場合は、 ' 'の中に特別な属性' name = RoleType'を置いていて、いつもラジオの価値を得ていましたあなたの投稿を読んだ後で、私はタグヘルパーを使用すると、 'asp-for'が自動的にnameとid属性を生成するので、name属性を使う必要はないことに気付きました。それは今働いています。すべての必要なコードとそれの簡単な説明を入れていただきありがとうございます。 – nam

関連する問題