这似乎应该很容易 - 但我无法让它工作!
我的模型中有一个枚举,我想将其显示为复选框列表。用户可以选择多个复选框,我想将其保存在数据库中。
所以枚举就是这样(大约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>
它不起作用!我想我错过了一些明显的东西,但我无法弄清楚是什么。没有错误 - 只是一个空的数据库表,其中引用者应该是......
与往常一样,任何帮助都非常感谢!
答案 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();