2010-11-10 23 views
11

我不知道任何人都可以在这个问题上提供一些线索..OPTGROUP下拉支持MVC - 问题与模型绑定

我得选择一个人的种族选项组下拉 - 然而,它的不存储模型中的值。

视图模型

[UIHint("EthnicOriginEditorTemplate")] 
    [DisplayName("Question 6: Ethnic Origin")] 
    public int EthnicOrigin { get; set; } 

助手:GroupDropList.Cs

using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.Mvc; 
using System.Web.Routing; 

namespace Public.Helpers 
{ 
    public static class GroupDropListExtensions 
    { 
     public static string GroupDropList(this HtmlHelper helper, string name, IEnumerable<GroupDropListItem> data, int SelectedValue, object htmlAttributes) 
     { 
      if (data == null && helper.ViewData != null) 
       data = helper.ViewData.Eval(name) as IEnumerable<GroupDropListItem>; 
      if (data == null) return string.Empty; 

      var select = new TagBuilder("select"); 

      if (htmlAttributes != null) 
       select.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 

      select.GenerateId(name); 

      var optgroupHtml = new StringBuilder(); 
      var groups = data.ToList(); 
      foreach (var group in data) 
      { 
       var groupTag = new TagBuilder("optgroup"); 
       groupTag.Attributes.Add("label", helper.Encode(group.Name)); 
       var optHtml = new StringBuilder(); 
       foreach (var item in group.Items) 
       { 
        var option = new TagBuilder("option"); 
        option.Attributes.Add("value", helper.Encode(item.Value)); 
        if (SelectedValue != 0 && item.Value == SelectedValue) 
         option.Attributes.Add("selected", "selected"); 
        option.InnerHtml = helper.Encode(item.Text); 
        optHtml.AppendLine(option.ToString(TagRenderMode.Normal)); 
       } 
       groupTag.InnerHtml = optHtml.ToString(); 
       optgroupHtml.AppendLine(groupTag.ToString(TagRenderMode.Normal)); 
      } 
      select.InnerHtml = optgroupHtml.ToString(); 
      return select.ToString(TagRenderMode.Normal); 
     } 
    } 

    public class GroupDropListItem 
    { 
     public string Name { get; set; } 
     public List<OptionItem> Items { get; set; } 
    } 

    public class OptionItem 
    { 
     public string Text { get; set; } 
     public int Value { get; set; } 
    } 
} 

这是我EditorTemplate

<%@ Import Namespace="Public.Helpers"%> 
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<int>"%> 

<%=Html.GroupDropList("EthnicOrigin", 
           new[] 
            {           
             new GroupDropListItem 
              { 
               Name = "Ethnicity", 
               Items = new List<OptionItem> 
                 { 
                  new OptionItem {Value = 0, Text = "Please Select"} 
                 } 
              }, 

             new GroupDropListItem 
              { 
               Name = "a) White", 
               Items = new List<OptionItem> 
                 { 
                  new OptionItem {Value = 1, Text = "British"}, 
                  new OptionItem {Value = 2, Text = "Irish"}, 
                  new OptionItem {Value = 3, Text = "Other White (Please specify below)"} 
                 } 
              }, 

             --snip 

            }, Model, null)%> 

并在视图我引用它:

<%=Html.EditorFor(x => x.EthnicOrigin, "EthnicOriginEditorTemplate")%> 

但是它没有经过选择的价值到模型......有没有人遇到类似的问题...提前为一些指针非常感谢。

+0

刚一说明 - 我也有试过这个字符串而不是int作为选项值,并且它仍然不绑定。 – beebul 2010-11-10 10:08:37

+0

请检查[现在支持Dropdownlist .Net MVC Optgroup](http://www.jquery2dotnet.com/2014/01/html5-dropdownlist-optgroup-tag-in-mvc.html) – Sender 2014-01-27 17:22:44

回答

8

您的select没有name属性,因此当您提交表单时,所选值不会发送到服务器。您需要添加一个名字:

select.GenerateId(name); 
select.MergeAttribute("name", name); 
+0

非常感谢达林 - 工作一个治疗...... :-) – beebul 2010-11-10 14:12:56

5

只是改变了辅助类来得到它MVC 3和可空INT工作。 非常感谢这堂课,为我节省了大量的时间。

public static class GroupDropListExtensions 
{ 
    public static MvcHtmlString GroupDropList(this HtmlHelper helper, string name, IEnumerable<GroupDropListItem> data, int? SelectedValue, object htmlAttributes) 
    { 
     if (data == null && helper.ViewData != null) 
      data = helper.ViewData.Eval(name) as IEnumerable<GroupDropListItem>; 
     if (data == null) return new MvcHtmlString(string.Empty); 

     var select = new TagBuilder("select"); 

     if (htmlAttributes != null) 
      select.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 

     select.GenerateId(name); 
     select.MergeAttribute("name", name); 

     var optgroupHtml = new StringBuilder(); 
     var groups = data.ToList(); 
     foreach (var group in data) 
     { 
      var groupTag = new TagBuilder("optgroup"); 
      groupTag.Attributes.Add("label", helper.Encode(group.Name)); 
      var optHtml = new StringBuilder(); 
      foreach (var item in group.Items) 
      { 
       var option = new TagBuilder("option"); 
       option.Attributes.Add("value", helper.Encode(item.Value)); 
       if (SelectedValue != 0 && item.Value == SelectedValue) 
        option.Attributes.Add("selected", "selected"); 
       option.InnerHtml = helper.Encode(item.Text); 
       optHtml.AppendLine(option.ToString(TagRenderMode.Normal)); 
      } 
      groupTag.InnerHtml = optHtml.ToString(); 
      optgroupHtml.AppendLine(groupTag.ToString(TagRenderMode.Normal)); 
     } 
     select.InnerHtml = optgroupHtml.ToString(); 
     return new MvcHtmlString(select.ToString(TagRenderMode.Normal)); 
    } 
} 

public class GroupDropListItem 
{ 
    public string Name { get; set; } 
    public List<OptionItem> Items { get; set; } 
} 

public class OptionItem 
{ 
    public string Text { get; set; } 
    public int Value { get; set; } 
} 
1

这是原生支持使用SelectListGroup为ASP.NET MVC 5.2:

var items = new List<SelectListItem>(); 
var group1 = new SelectListGroup() { Name = "Group 1" }; 
items.Add(new SelectListItem() { Text = "Item1", Group = group1 }); 
在MVC

然后,做

@Html.DropDownList("select", items)