2013-12-19 6 views
25

タイトルが不明な場合にはお詫び申し上げます。Listプロパティ付きモデルのASP.NET MVC CheckBoxList

私はASP.NET MVCのフォーム送信から自分のモデルを返そうとしています。

は、私の質問は、ほぼ唯一の私が持っていないという点で異なるthis questionと同じであるが、List<Model>ようなモデル:私は管理者がときから選択することができ、チェックボックスなどUserRolesを必要

public Model 
{ 
    string UserName {get; set;} 
    string Password {get; set;} 
    List<Roles> UserRoles {get; set;} 
} 

新しいユーザーを作成します。私の質問は、私はどのように '@ Html.CheckBoxFor'をリストに対して使用するのか不明です。私はこれを試みた:

これは決してうまくいかなかった - ページのすべてのラベルは "名前"であり、私のリストはPOSTで空だった。誰も私にこれに関するガイダンスを提供することはできますか?

+3

このMVCチュートリアルでは、モデルのビューでチェックボックスを使用する良い例があります。ページの途中から開始します。 http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/updating-related-data-with-the-entity-framework-in-an-asp- net-mvc-application –

答えて

40

全く離れレイザーからどこへ行く必要はありません。

これは私の作品:ビュー内のコードから

for (var i = 0; i < Model.UserRoles.Count(); i++) 
{ 
    var role = Model.UserRoles[i]; 
    @Html.HiddenFor(model => model.UserRoles[i].RoleId) 
    @Html.CheckBoxFor(model => model.UserRoles[i].Selected) 
    @Html.LabelFor(model=> model.UserRoles[i].Name, role.Name) 
} 
+4

これはいいですが、小さな修正です。 'LabelFor'は' CheckBoxFor'と同じものにバインドする必要があります: '@Html.LabelFor(model => model.UserRoles [i] .Selected、role.Name)' –

+0

返信後に名前が取得されない –

+1

@ Html.HiddenFor(model => model.UserRoles [i] .Name)を最後に追加すると、 –

9

ロールIDを非表示にする必要はありません。ユーザーの選択したロールを保存するときに、すべてのロールをループして選択したロールを確認する必要はありません。

ビュー

@foreach (Roles info in Model.UserRoles) 
{ 
    <span> 
     <input type="checkbox" class="checkbox" name="selectedRoles" value="@info.RoleName" id="@infoRoleName" /> 
     <label for="@info.RoleName">@info.RoleName</label> 
    </span> 
} 

アクション

[HttpPost] 
public ActionResult CreateUsers(Model model, string[] selectedRoles) 
{ 
     // 
} 
+1

ネイティブHTMLを使用する必要はありません。コントローラーは2つのモデルをどのように結び付けますか? – LiverpoolsNumber9

+3

私はネイティブHTMLを使用しました。しかし文字通り、2つのモデルを結びつけることはできません。できません。あなたはできません。できません。 (私はあなたができないと言いましたか?)可能であれば、それは "MsVC"と呼ばれるでしょう。 – LiverpoolsNumber9

+1

hi @ LiverpoolsNumber9、この問題を解決する方法がわかっている場合は、MVCビューに2つの送信ボタンが表示されていますか。これがどのように機能するか知っています。 – Lin

1

、ポストはあなたのポストのアクションを提供する正常に動作する必要があり、次のようになります

として渡ってモデルを渡す
[HttpPost] 
public ActionResult Action(Model model) 
{ 
    return View(model); 
} 

すなわち引数。

@model YourNameSpace.Model 
+2

の投稿後にName値を取得することができます。 – LiverpoolsNumber9

+0

@ liverpoolsnumber9良い点、私は今日半分眠っています。私の答えのその部分を削除しました。 :) – hutchonoid

+0

ハハハ。私は共感する:) – LiverpoolsNumber9

0

ポストサーバにチェックボックスのリストを、左
LINQをチェックするかどうかをチェックするために参加するチェックされた項目のリストを取得するには、チェックボックスを生成:

また、あなたはあまりにビューでモデルの参照を持っていることを確認してください、リスト

ビュー

List<eDurar.Models.tbl_ISOCetificate> ModList = db.tbl_ISOCetificate.ToList(); 

    var li = (from cert in db.tbl_ISOCetificate join comCert in db.tbl_CompCertificate on cert.Cert_id equals comCert.CompCer_id into jo from b in jo.DefaultIfEmpty() 
       select new {cert.Cert_id,cert.Cert_Name,chkd = b.CompCer_SerId==null?"":"checked"}).ToList(); 


    foreach (var item in li) 
    {  
     @:<div style="width: 30%; display: inline-block; margin: 1em"> 
     @:<input type="checkbox" @item.chkd name="CheckedCertificates" value="@item.Cert_id"> 
     @:<label>@item.Cert_Name</label> 
     @:</div> 
    } 

コントローラ

0123をチェックして受信
[HttpPost] 
    public ActionResult ManageSurveyGroup(int[] CheckedCertificates) 
    { 
     return View(); 
    } 
関連する問題