2012-06-26 20 views
12

午前すべて。MVC 4、チェックボックスリストと私

これは他のところで議論されていますが、私のようなシンプトンのMVC 4では何か変更や事柄が簡単になったのかなと思いましたか?

シナリオ

I以下、編集し、モデルあります

<fieldset> 
    <legend>CorporateDetails</legend> 



    <div class="editor-label"> 
     @Html.LabelFor(model => model.EmsId, "EmsType") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("EmsId", String.Empty) 
     @Html.ValidationMessageFor(model => model.EmsId) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.EmsName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.EmsName) 
     @Html.ValidationMessageFor(model => model.EmsName) 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 

これが出て、私を与える:以下の規格に

public class CorporateDetails 
{ 

    public Guid? Id { get; set; } 

    [Key] 
    public int CorporateDetailId { get; set; } 

    public int? EmsId { get; set; } 
    public string EmsName { get; set; } 

    public virtual EmsType EmsType { get; set; } 
} 

public class EmsType 
{ 
    [Key] 
    public int? EmsId { get; set; } 
    public string EmsName { get; set; } 

    public virtual ICollection<EmsType> EmsTypes { get; set; } 
} 

ビューを作成箱の美しいドロップダウn list a la Scott Gu's blog

今、私の本当の疑問はこれです - どのように効果的にマルチ選択、チェックボックスのリストになるものにこのドロップダウンボックスを変換できますか?

また、踏まれたことをお詫び申し上げますが、更新が行われたかどうかを確認するためだけに水をテストしていました。

は、最初のMVCプロジェクトは、私は再び非常に厚い感じて、優しく行くに注意してください: '(

答えて

19

私はそれを整理しました。 D

モデル

public class CorporateDetails 
    { 

     public Guid? Id { get; set; } 

     [Key] 
     public int CorporateDetailId { get; set; } 

     public int[] EmsId { get; set; } 

     } 

    public class EmsType 
    { 
     [Key] 
     public int EmsId { get; set; } 
     public string EmsName { get; set; } 

     public virtual ICollection<EmsType> EmsTypes { get; set; } 
    } 

コントローラ

public ActionResult Create() 
    { 
     CorporateDetails corporatedetails = new CorporateDetails(); 
     ViewBag.EmsId = new MultiSelectList(db.EmsTypes, "EmsId", "EmsName"); 
     return View(corporatedetails); 
    } 
:あなたがコメントからわかるように、思いついたが、仕事をする完全なソリューションの下に見つけてくださいいくつかの問題がありました

拡張子(プロジェクトのルートにあるフォルダに配置)

public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty[]>> expression, MultiSelectList multiSelectList, object htmlAttributes = null) 
    { 
     //Derive property name for checkbox name 
     MemberExpression body = expression.Body as MemberExpression; 
     string propertyName = body.Member.Name; 

     //Get currently select values from the ViewData model 
     TProperty[] list = expression.Compile().Invoke(htmlHelper.ViewData.Model); 

     //Convert selected value list to a List<string> for easy manipulation 
     List<string> selectedValues = new List<string>(); 

     if (list != null) 
     { 
      selectedValues = new List<TProperty>(list).ConvertAll<string>(delegate(TProperty i) { return i.ToString(); }); 
     } 

     //Create div 
     TagBuilder divTag = new TagBuilder("div"); 
     divTag.MergeAttributes(new RouteValueDictionary(htmlAttributes), true); 

     //Add checkboxes 
     foreach (SelectListItem item in multiSelectList) 
     { 
      divTag.InnerHtml += String.Format("<div><input type=\"checkbox\" name=\"{0}\" id=\"{0}_{1}\" " + 
               "value=\"{1}\" {2} /><label for=\"{0}_{1}\">{3}</label></div>", 
               propertyName, 
               item.Value, 
               selectedValues.Contains(item.Value) ? "checked=\"checked\"" : "", 
               item.Text); 
     } 

     return MvcHtmlString.Create(divTag.ToString()); 
    } 

ビューのWeb構成に私のチェックボックスの素敵なリストを与える

<pages pageBaseType="System.Web.Mvc.WebViewPage"> 
    <namespaces> 
    <add namespace="System.Web.Mvc" /> 
    <add namespace="System.Web.Mvc.Ajax" /> 
    <add namespace="System.Web.Mvc.Html" /> 
    <add namespace="System.Web.Optimization"/> 
    <add namespace="System.Web.Routing" /> 
    <add namespace="MyProject.Extensions" /> 
    </namespaces> 
</pages> 

ビュー

@model Valpak.Websites.HealthChecker.Models.CorporateDetails 
@{ 
    ViewBag.Title = "Create"; 
} 
<h2>Create</h2> 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>CorporateDetails</legend> 

      <div class="editor-label"> 
      @Html.CheckBoxListFor(model => model.EmsId, (MultiSelectList) ViewBag.EmsId) 
      </div>   
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 
<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 
@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

を登録拡張。ハレイ!

あなたのお手伝いをしてくれてありがとうございます、私はこれを答えとしてマークしましたが、あなたの時間と労力は+50です。

+0

本当に有益ですが、検証が含まれていればさらに良いでしょう。現在のところ、すべてのテキストボックスに赤い枠線が表示されます。検証に問題がある場合は、その機能をどのように組み込むか考えていますか? – Owen

2

変更は、この局面ではASP.NET MVC 4 RCで発生していないし、それがRTMに当たったときに発生することはほとんどありません。

しかし、それを達成するために、あなたは可能性がまだimplement a custom helper。そして、それは代わりに、強く型付けされたバージョンを持っているために、文字列の最初の引数としてラムダ式をとるようにあなたも、このヘルパーを向上させることができます。

そして、あなたの場合ここでは列挙型を使用していませんanother example

+0

おかげダーリンにヘルパー - 拡張子exmapleと、私は追加する必要がありますそれは私のプロジェクトのどこか、具体的には見解の中で? (愚かな質問の謝罪、先の "最初のMVCプロジェクト"の脚注を参照してください) –

+0

'Extensions'フォルダを作成し、その内部に' HtmlExtensions.cs'クラスを作成して宣言します。理にかなって –

+0

:D –

5

ニースソリューション -

他の人が参照するだけのために - 私は、あなたのように、CheckBoxListのための必要性に遭遇していた - 私はここで、これを使用している:

http://www.codeproject.com/Articles/292050/CheckBoxList-For-a-missing-MVC-extension

それは素晴らしい作品。 ..よく書かれています - これが誰かを助けることができれば願っ

ローレンは

1

あなたはMultiSelectedに選択された値を渡した場合(パラメータ#4)

ViewBag.VfonctionIds = new MultiSelectList(db.tbIntervenantFonctionTypes, "intervenantFonctionType_id", "Nom", fonctionSelected); 

変更

 public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty[]>> expression, MultiSelectList multiSelectList, object htmlAttributes = null) 
    { 
     //Derive property name for checkbox name 
     MemberExpression body = expression.Body as MemberExpression; 
     string propertyName = body.Member.Name; 

     //Create div 
     TagBuilder divTag = new TagBuilder("div"); 
     divTag.MergeAttributes(new RouteValueDictionary(htmlAttributes), true); 

     //Add checkboxes 
     foreach (SelectListItem item in multiSelectList) 
     { 
      divTag.InnerHtml += String.Format("<div><input type=\"checkbox\" name=\"{0}\" id=\"{0}_{1}\" " + 
               "value=\"{1}\" {2} /><label for=\"{0}_{1}\">{3}</label></div>", 
               propertyName, 
               item.Value, 
               (item.Selected) ? "checked=\"checked\"" : "",              
               item.Text); 
     } 

     return MvcHtmlString.Create(divTag.ToString()); 
    } 
関連する問題