2011-02-01 95 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 
} 

由此說明是什麼顯示在用戶界面中,並且數值是什麼是要保存在數據庫中。這些數字必須保持在列表中,因爲它們直接進入統計數據包。

我然後定義一個類引薦:

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> 

而且這是行不通的!我想我錯過了一些明顯的東西,但我無法弄清楚什麼。有沒有錯誤 - 只是一個空的數據庫表,其中referrers應該是...

一如既往,任何幫助非常感謝!

回答

2

讓我們花點時間,看看我們需要在這裏。我們需要顯示一個表單,其中包含多個複選框(一個用於枚舉的每個值)和一個關聯的標籤(這個標籤應該來自於在枚舉上使用的Description屬性)。提交此表單時,我們希望獲取使用檢查過的所有值。

,以便始終一旦我們有什麼,我們正在做我們介紹我們的視圖模型明確的定義:

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) 
    { 
     ... 
    } 
} 

最後一個強類型查看我們的控制器(〜/ Views/Home/Index.aspx)的Index動作對應的視圖:

<% 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> 

現在,當這種形式是後索引操作中提交你會得到所有的枚舉的列表,指明用戶是否相應的布爾值檢查與否。

+0

謝謝 - 非常棒的迴應,我現在就放棄它 - 這與當前實現的佈局完全不同,但我希望能夠像您所建議的那樣調整視圖模型構造。 – laura 2011-02-02 09:29:27

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 2011-02-02 09:27:48