【问题标题】:MVC 4, Checkbox list and meMVC 4,复选框列表和我
【发布时间】: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 项目所以慢慢来,我又觉得很厚:'(

【问题讨论】:

    标签: asp.net-mvc razor drop-down-menu checkbox asp.net-mvc-4


    【解决方案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.HtmlHelper' has no applicable method named 'CheckBoxListFor ' 但似乎有一个名为该名称的扩展方法。扩展方法不能动态调度。考虑强制转换动态参数或调用扩展方法而不使用扩展方法语法。我尝试将 @using MvcHtmlHelpers; (我的助手)添加到查看自己但卡住了。有什么想法吗?
      • 你怎么称呼它?我猜你正在使用ViewBag 或其他什么?
      • 完全正确 - 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());
          }
      

      【讨论】:

        猜你喜欢
        • 2012-12-25
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2013-08-05
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 2013-04-29
        相关资源
        最近更新 更多