如何从ASP.NET CheckBox中获取多个选项

时间:2011-02-01 18:24:23

标签: c# asp.net asp.net-mvc checkbox

这似乎应该很容易 - 但我无法让它工作!

我的模型中有一个枚举,我想将其显示为复选框列表。用户可以选择多个复选框,我想将其保存在数据库中。

所以枚举就是这样(大约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上显示的内容,数值是要保存在数据库中的内容。这些数字必须保持列出状态,因为它们直接进入统计数据包。

然后我定义了一个Referrer类:

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 个答案:

答案 0 :(得分: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)
    {
        ...
    }
}

最后是一个强类型视图,对应于我们控制器的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索引操作中提交此表单时,您将获得所有枚举的列表,其中包含相应的布尔值,指示用户是否选中了它。

答案 1 :(得分:1)

OT:不要执行多余的行动:

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

或只是

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