Asp.net mvc dropdownlist的ASP.NETMVC视图模型?

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(

我试图在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(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谢谢你的澄清。我的剪切和粘贴失败了,我没有很好的证明。我编辑了我的原始示例。是的,我的剪切和粘贴失败了,我没有很好地证明。我编辑了我的原始示例。