Asp.net mvc dropdownlist的ASP.NETMVC视图模型?
我试图在MVC中使用生成的月份下拉列表。 我的viewmodel是:Asp.net mvc dropdownlist的ASP.NETMVC视图模型?,asp.net-mvc,Asp.net Mvc,我试图在MVC中使用生成的月份下拉列表。 我的viewmodel是: public class MyViewModel{ public MyViewModel() { var monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList(); Months = new SelectList(monthNames.Select(m=> new{Id=monthNames.IndexOf(
public class MyViewModel{
public MyViewModel()
{
var monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
Months = new SelectList(monthNames.Select(m=> new{Id=monthNames.IndexOf(m)+1, Name=m}).ToList(),"Id","Name");
}
public IEnumerable<SelectListItem> Months{ get; set; }
public string Month{ get; set; }
}
问题是Months属性总是返回空值,因此在尝试呈现DDL时,页面会出错
看起来很简单。我遗漏了什么?您遗漏了实际将
Months
属性设置为null以外的内容的部分
您只需在属性上定义一个自定义getter,使其始终返回一个可枚举项:
public IEnumerable<SelectListItem> Months
{
List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
foreach (var month in monthNames)
{
yield return new SelectListItem
{
Value = monthNames.IndexOf(month) + 1,
Text = month
};
}
}
公共IEnumerable月
{
List monthNames=DateTimeFormatInfo.CurrentInfo.monthNames.Take(12.ToList();
foreach(月内var月)
{
返回新的SelectListItem
{
值=月指数(月)+1,
文本=月份
};
}
}
您缺少实际将月份
属性设置为null以外的值的部分
您只需在属性上定义一个自定义getter,使其始终返回一个可枚举项:
public IEnumerable<SelectListItem> Months
{
List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
foreach (var month in monthNames)
{
yield return new SelectListItem
{
Value = monthNames.IndexOf(month) + 1,
Text = month
};
}
}
公共IEnumerable月
{
List monthNames=DateTimeFormatInfo.CurrentInfo.monthNames.Take(12.ToList();
foreach(月内var月)
{
返回新的SelectListItem
{
值=月指数(月)+1,
文本=月份
};
}
}
作为使用模板的另一种可能的解决方案:
// in your model, decorate it to use the template
[UIHint("MonthName")]
public String Month { get; set; }
然后在~/Views/Shared/EditorTemplates/MonthName.cshtml
中:
@model String
@Html.DropDown(
String.Empty,
@Model,
new SelectList(
System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames
.Where(x => !String.IsNullOrEmpty(x))
.Select((x,y) => new { Text = x, Value = y + 1 }),
"Value",
"Text"
)
)
最后,在你看来:
@Html.EditorFor(x => x.Month)
虽然这只适用于固定列表(如月份),而不适用于基于所显示视图的动态内容。另一种可能的解决方案是使用模板:
// in your model, decorate it to use the template
[UIHint("MonthName")]
public String Month { get; set; }
然后在~/Views/Shared/EditorTemplates/MonthName.cshtml
中:
@model String
@Html.DropDown(
String.Empty,
@Model,
new SelectList(
System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames
.Where(x => !String.IsNullOrEmpty(x))
.Select((x,y) => new { Text = x, Value = y + 1 }),
"Value",
"Text"
)
)
最后,在你看来:
@Html.EditorFor(x => x.Month)
虽然这只在固定列表(如月份)中才有价值,但对于基于显示的视图可能是动态的内容则没有价值。您的代码没有问题,因此您的问题可能在于未显示的内容。例如,您是在局部视图中执行此操作的吗?是的,它是在局部视图中。为什么我们需要调用.Take(12).ToList()?@AlexeyAza:
MonthNames
实际上返回一个固定字符串[13],因此我假设这是删除最后一个空元素的OPs方式(尽管,IMHO,这种方式会破坏整个本地化点);p@BradChristie感谢您的澄清您的代码没有问题,因此您的问题可能是您没有显示的内容。例如,您是在局部视图中执行此操作的吗?是的,它是在局部视图中。为什么我们需要调用.Take(12).ToList()?@AlexeyAza:MonthNames
实际上返回一个固定字符串[13],因此我假设这是删除最后一个空元素的OPs方式(尽管,IMHO,这种方式会破坏整个本地化点);p@BradChristie谢谢你的澄清。我的剪切和粘贴失败了,我没有很好的证明。我编辑了我的原始示例。是的,我的剪切和粘贴失败了,我没有很好地证明。我编辑了我的原始示例。