2011-02-01 24 views
1

これは簡単に行うことができるようですが、動作させることができません。ASP.NETチェックボックスから複数の選択肢を取得するには

モデルにはチェックボックスのリストとして表示したい列挙型があります。ユーザーは複数のチェックボックスを選択でき、これをデータベースに保存します。

だから、列挙型はそう(約20要素大辞典)のようなものです:

public enum ReferrerType 
{ 
    [Description("No Data")] 
    NoData = 9999, 
    [Description("Father or Mother")] 
    Parents = 1, 
    [Description("Brother or Sister")] 
    Sibling = 2, 
    [Description("Other")] 
    Other = 10 
} 

説明UIに表示されているもので、数値がデータベースに保存することがあるものとなります。数字は統計パッケージに直接入るので、リストに載ったままでなければなりません。

私は、リファラーのクラスを定義した:

public class Referrer 
{ 
    public virtual Guid Id { get; private set; } 
    public virtual ReferrerType{ get; set; } 
} 

私はこれが奇数(アンチ)パターンかもしれません実現。私は急いでそれを開発し、余暇で悔い改めています。このモデルを改善するためのアドバイスも大歓迎です!

私のコントローラがリストアップセット:

private static IList<string> GenerateReferrerList() 
{ 
    var values = from ReferrerType e in Enum.GetValues(typeof(ReferrerType)) 
       select new { Name = e.ToDescription() }; 

    return values.Select(x => x.Name).ToList(); 
} 

をそして私はこのように私のビューでそれを使用します。

<div class="radio-boolean form-field" id="Referrers"> 
     <p class="form-field-attribute"> <span class="label">Referred By </span> </p> 
     <% for (var i = 0; i < ((IList<string>)ViewData["ReferrerList"]).Count; i++) 
     { %> 
      <p class="form-field-value"> 
      <%= Html.CheckBox(string.Format("Referrers[{0}].Type", i)) %> 
      <label for="Referrers"> <%= ((IList<string>)ViewData["ReferrerList"])[i]%></label> 
     </p> 
</div> 

そして、それは動作しません!私は何か明白なものを見逃していると思うが、私は何かを解決することはできない。エラーはありません。リファラーが必要な空のデータベーステーブル...

いつもどんな助けもありがとうございました!

答えて

2

の瞬間を取ると、私たちがここで必要なのか見てみましょうが。複数のチェックボックス(列挙型の各値に1つずつ)と関連するラベル(このラベルは、列挙型の説明属性から使用する必要があります)を含むフォームを表示する必要があります。このフォームが送信されると、使用がチェックしたすべての値を取得します。

public class MyViewModel 
{ 
    public bool IsChecked { get; set; } 
    public ReferrerType ReferrerType { get; set; } 
    public string Text { get; set; } 
} 

その後、我々は、コントローラを書く:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = Enum.GetValues(typeof(ReferrerType)).Cast<ReferrerType>().Select(x => new MyViewModel 
     { 
      ReferrerType = x, 
      Text = x.ToDescription() // I guess that's an extension method you wrote 
     }); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(IEnumerable<MyViewModel> model) 
    { 
     ... 
    } 
} 

そして最後に、強く型付けされたので、いつものように我々は我々が我々の見解モデルを導入しようとしているかの明確な定義を持っていたら

コントローラのIndexアクションに対応するビュー(〜/ Views/Home/Index.aspx):

<% using (Html.BeginForm()) { %> 
    @Html.EditorForModel() 
    <input type="submit" value="OK" /> 
<% } %> 

と最後の部分は、対応するエディタのテンプレート(~/Views/Home/EditorTemplates/MyViewModel.ascx)です:

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.MyViewModel>" %> 
<%= Html.CheckBoxFor(x => x.IsChecked) %> 
<%= Html.HiddenFor(x => x.ReferrerType) %> 
<label><%: Model.Text %></label> 

このフォームはPOSTのindexアクション内に提出されたときに今、あなたは、ユーザーかどうかを示す対応するブール値を持つすべての列挙型のリストを取得しますそれをチェックしたかどうか。

+0

お返事ありがとうございます。私はこれを今すぐ行っています。これは現在の実装がどのようにレイアウトされているかとはかなり異なりますが、あなたの提案のようにviewmodel構造を適応させることを望みます。 – laura

1

OT:余分なアクションを実行しないでください:

return (from e in Enum.GetValues(typeof(ReferrerType)) 
     select e.ToDescription()).ToList(); 

か、単に

return Enum.GetValues(typeof(ReferrerType)).Select(e => e.ToDescription()).ToList(); 
+0

チップのおかげで! – laura

関連する問題