Asp.net mvc 2 MVC中的Optgroup下拉支持-模型绑定问题
我想知道是否有人能解释一下这个问题 我有一个选项组下拉列表来选择一个人的种族,但是它没有在模型中存储值 视图模型Asp.net mvc 2 MVC中的Optgroup下拉支持-模型绑定问题,asp.net-mvc-2,drop-down-menu,optgroup,Asp.net Mvc 2,Drop Down Menu,Optgroup,我想知道是否有人能解释一下这个问题 我有一个选项组下拉列表来选择一个人的种族,但是它没有在模型中存储值 视图模型 [UIHint("EthnicOriginEditorTemplate")] [DisplayName("Question 6: Ethnic Origin")] public int EthnicOrigin { get; set; } 助手:GroupDropList.Cs using System.Collections.Generic; using
[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; }
}
}
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Web.Mvc;
使用System.Web.Routing;
命名空间Public.Helpers
{
公共静态类groupdListensions
{
公共静态字符串GroupDropList(此HtmlHelper帮助程序、字符串名称、IEnumerable数据、int-SelectedValue、对象htmlAttributes)
{
if(data==null&&helper.ViewData!=null)
data=helper.ViewData.Eval(名称)作为IEnumerable;
if(data==null)返回字符串.Empty;
var select=新标记生成器(“选择”);
如果(htmlAttributes!=null)
select.MergeAttributes(新的RouteValueDictionary(htmlAttributes));
选择.GenerateId(名称);
var optgroupHtml=new StringBuilder();
var groups=data.ToList();
foreach(数据中的var组)
{
var groupTag=新标记生成器(“optgroup”);
添加(“标签”,helper.Encode(group.Name));
var optHtml=新的StringBuilder();
foreach(group.Items中的变量项)
{
var选项=新标记生成器(“选项”);
option.Attributes.Add(“value”,helper.Encode(item.value));
if(SelectedValue!=0&&item.Value==SelectedValue)
选项。属性。添加(“选定”、“选定”);
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();
返回select.ToString(TagRenderMode.Normal);
}
}
公共类组项
{
公共字符串名称{get;set;}
公共列表项{get;set;}
}
公共阶级选择论
{
公共字符串文本{get;set;}
公共int值{get;set;}
}
}
这是我的编辑模板
<%@ 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")%>
x.EthnicOrigin,“EthnicOriginEditorTemplate”)%%>
但是,它不会将选定的值传递到模型中。。。有没有人经历过类似的问题。。。非常感谢您提供一些提示。您的
select
没有name
属性,因此当您提交表单时,所选值不会发送到服务器。您需要添加一个名称:
select.GenerateId(name);
select.MergeAttribute("name", name);
刚刚更改了helper类,使其适用于MVC 3和可为null的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; }
}
公共静态类groupdLopListensions
{
公共静态MvcHtmlString组滴列表(此HtmlHelper帮助程序、字符串名称、IEnumerable数据、int?SelectedValue、对象htmlAttributes)
{
if(data==null&&helper.ViewData!=null)
data=helper.ViewData.Eval(名称)作为IEnumerable;
if(data==null)返回新的MvcHtmlString(string.Empty);
var select=新标记生成器(“选择”);
如果(htmlAttributes!=null)
select.MergeAttributes(新的RouteValueDictionary(htmlAttributes));
选择.GenerateId(名称);
选择.MergeAttribute(“名称”,名称);
var optgroupHtml=new StringBuilder();
var groups=data.ToList();
foreach(数据中的var组)
{
var groupTag=新标记生成器(“optgroup”);
添加(“标签”,helper.Encode(group.Name));
var optHtml=新的StringBuilder();
foreach(group.Items中的变量项)
{
var选项=新标记生成器(“选项”);
option.Attributes.Add(“value”,helper.Encode(item.value));
if(SelectedValue!=0&&item.Value==SelectedValue)
选项。属性。添加(“选定”、“选定”);
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();
返回新的MvcHtmlString(select.ToString(TagRenderMode.Normal));
}
}
公共类组项
{
公共字符串名称{get;set;}
公共列表项{get;set;}
}
公共阶级选择论
{
公共字符串文本{get;set;}
公共int值{get;set;}
}
从ASP.NET MVC 5.2开始,使用SelectListGroup本机支持此操作:
var items = new List<SelectListItem>();
var group1 = new SelectListGroup() { Name = "Group 1" };
items.Add(new SelectListItem() { Text = "Item1", Group = group1 });
请注意,我也尝试过使用string而不是int作为选项值,但它仍然没有绑定。请检查
@Html.DropDownList("select", items)