Asp.net mvc 3 使用@Html.EditorFor时MVC3未呈现我的选择列表

Asp.net mvc 3 使用@Html.EditorFor时MVC3未呈现我的选择列表,asp.net-mvc-3,Asp.net Mvc 3,我正在尝试使用Razor和MVC3渲染ViewModel。由于某些原因,我的SelectList(下面的WidgetTypes)没有呈现,即使其余的都呈现得很好。谁能解释一下为什么不呢?我不想将视图更改为对每个字段使用@Html.EditorFor(m=>m.SystemName)等,因为我对小部件使用动态模型,这将导致相同的问题 我的ViewModel: public class CreateWidgetViewModel { [Required] public string

我正在尝试使用Razor和MVC3渲染ViewModel。由于某些原因,我的SelectList(下面的WidgetTypes)没有呈现,即使其余的都呈现得很好。谁能解释一下为什么不呢?我不想将视图更改为对每个字段使用@Html.EditorFor(m=>m.SystemName)等,因为我对小部件使用动态模型,这将导致相同的问题

我的ViewModel:

public class CreateWidgetViewModel 
{
    [Required]
    public string Title { get; set; }

    [Required(ErrorMessage = "The System Name is required")]
    [Display(Name = "System Name")]
    public string SystemName { get; set; }

    [Required]
    [Display(Name = "Widget Type")]
    public string WidgetType { get; set; }

    [Required]
    [Display(Name = "Widget Types")]
    public SelectList WidgetTypes { get; set; }
}
我的控制器:

[HttpGet]
public ActionResult Create()
{
    var widgetTypes = from wt in _widgetService.WidgetTypes
                      select new
                      {
                          Name = wt.WidgetName,
                          WidgetType = wt.GetType().AssemblyQualifiedName
                      };

    var viewModel = new CreateWidgetViewModel
    {
        WidgetTypes = new SelectList(widgetTypes, "WidgetType", "Name")
    };

    if (Request.IsAjaxRequest())
    {
        return PartialView(viewModel);
    }
    return View(viewModel);
}
我的看法是:

@{
    ViewBag.CurrentPage = "widgets";
}
<h2>@ViewBag.Title</h2>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <div>
            @Html.EditorFor(model => model)
        </div>
    </fieldset>
    <div>
        <input type="submit" value="Save" />&nbsp;or&nbsp;@Ajax.ActionLink("Back to list", "Index", "Widget", 
        new AjaxOptions { HttpMethod = "Get", UpdateTargetId = "ajax-replace" })
    </div>
}
@{
ViewBag.CurrentPage=“小部件”;
}
@视图包。标题
@使用(Html.BeginForm())
{
@Html.ValidationSummary(true)
@EditorFor(model=>model)
或者@Ajax.ActionLink(“返回列表”、“索引”、“小部件”,
新的AjaxOptions{HttpMethod=“Get”,UpdateTargetId=“ajax replace”})
}

如果要生成下拉列表,需要使用
Html.DropdownListFor
帮助程序。您将
SelectList
用作某些属性的类型并不意味着默认编辑器模板将呈现一个
框。因此,您必须编写一个自定义编辑器模板


您可以查看以下内容,了解这些默认模板是如何实现的。

我现在已经完成了。用这种方式不满意,但必须这样,谢谢。在模型中使用SelectList不是一件好事,因为它是不可序列化的-如果你打开状态服务器,你就完蛋了。