2012-01-30 15 views
0

我想使用Razor和MVC3呈现ViewModel。出于某种原因,我的SelectList(下面的WidgetTypes)不会渲染,即使其余的渲染都很好。任何人都可以说出为什么不是?我不希望将视图更改为对每个字段使用@ Html.EditorFor(m => m.SystemName)等,因为我使用的动态模型将导致相同的问题。MVC3使用@ Html.EditorFor时不呈现我的SelectList

我的视图模型:

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> 
} 
+0

在你的模型中使用SelectList并不是一件好事,因为它不是可序列化的 - 如果你打开状态服务器,你就会敬酒。 – gangelo 2012-09-11 23:58:50

回答

2

你需要的,如果你想生成一个下拉列表使用Html.DropdownListFor帮手。事实上,您已将SelectList用作某些属性的类型,并不意味着默认编辑器模板将呈现<select>框。所以你将不得不编写一个自定义编辑器模板。

你可以看看下面的blog post看看这些默认模板是如何实现的。

+0

我现在已经做到了。对此并不满意,但只需要,谢谢。 – Pieter 2012-01-30 19:14:46

相关问题