MVC 4,复选框列表和我
Posted
技术标签:
【中文标题】MVC 4,复选框列表和我【英文标题】:MVC 4, Checkbox list and me 【发布时间】:2012-06-27 14:26:14 【问题描述】:早上好。
我可以看到这已在其他地方讨论过,但想知道对于像我这样的傻瓜来说,MVC 4 中是否有任何改变或事情变得更简单?!
场景
我有以下经过编辑的模型:
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;
使用以下标准创建视图:
<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>
这给了我一个开箱即用的漂亮下拉列表Scott Gu's blog
现在我真正的问题是 - 我如何才能有效地将这个下拉框转换为有效的多选复选框列表?
再次道歉,我只是在试水,看看是否有任何更新。
请注意,第一个 MVC 项目所以慢慢来,我又觉得很厚:'(
【问题讨论】:
【参考方案1】:好的,我已经把它整理好了——万岁!正如您从 cmets 中看到的那样,出现了一些问题,但请在下面找到有效的完整解决方案: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());
在视图的网络配置中注册的扩展
<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")
这给了我一个可爱的复选框列表。万岁!
感谢 Darin 的帮助,我已将此标记为答案,但感谢您的时间和精力 +50。
【讨论】:
确实很有帮助,但如果包含验证会更好。目前,如果存在验证问题,我所有的文本框都会出现红色边框,您知道如何包含该功能吗?【参考方案2】:不错的解决方案 -
仅供其他人参考 - 我和你一样,需要一个复选框列表 - 我一直在这里使用它:
http://www.codeproject.com/Articles/292050/CheckBoxList-For-a-missing-MVC-extension
它工作得很好......写得很好 - 希望这可以帮助某人。
罗兰
【讨论】:
【参考方案3】:ASP.NET MVC 4 RC 在这方面没有发生任何变化,并且不太可能在遇到 RTM 时发生变化。
但您仍然可以通过implement a custom helper 实现这一目标。您甚至可以改进这个帮助器,使其将 lambda 表达式作为第一个参数而不是字符串,以便获得强类型版本。
如果你不使用枚举,这里是another example。
【讨论】:
感谢 Darin - 使用扩展名示例,我应该将其添加为我的项目中的任何位置,还是特别添加到视图中? (为这个愚蠢的问题道歉,请参阅前面的“第一个 MVC 项目”脚注) 您可以创建一个Extensions
文件夹并在其中声明它们的HtmlExtensions.cs
类。
Sorry Darin - me again :'( 我已经实现了这个但是收到一个严重的错误:CS1973: 'System.Web.Mvc.HtmlHelperViewBag
或其他什么?
完全正确 - ViewBag.EmsTypeId = new SelectList(db.EmsTypes, "EmsTypeId", "EmsTypeName");【参考方案4】:
如果您将选定的值传递给 MultiSelected(参数 #4)
ViewBag.VfonctionIds = new MultiSelectList(db.tbIntervenantFonctionTypes, "intervenantFonctionType_id", "Nom", fonctionSelected);
将 Helper 更改为
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());
【讨论】:
以上是关于MVC 4,复选框列表和我的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP MVC 中是不是可以创建一个包含复选框列表的下拉列表?
有没有办法将复选框列表绑定到 asp.net mvc 中的模型
为啥复选框选择列表总是在 ASP.NET MVC-5 中发布为 null [重复]