C# 由于表达式,部分视图中的DropDownListFor失败

C# 由于表达式,部分视图中的DropDownListFor失败,c#,asp.net-mvc,C#,Asp.net Mvc,我正在使用Visual Studio 2015社区版进行ASP.net MVC项目测试, 这是我的简单模型: public class TestModel { [Required] public string Name { get; set; } [UIHint("EnumList")] public TestState State { get; set; } } public enum TestState { eNone, eNew,

我正在使用Visual Studio 2015社区版进行ASP.net MVC项目测试, 这是我的简单模型:

public class TestModel
{
    [Required]
    public string Name { get; set; }

    [UIHint("EnumList")]
    public TestState State { get; set; }
}

public enum TestState
{
    eNone,
    eNew,
    eFinished,
}
下面是一个通用的html-EnumList.cshtml

@model Enum

@Html.DropDownListFor(m => m, Enum.GetValues(Model.GetType()).OfType<Enum>()
    .Select(m =>
    {
        string enumVal = Enum.GetName(Model.GetType(), m);
        return new SelectListItem()
        {
            Selected = (Model.ToString() == enumVal),
            Text = enumVal,
            Value = enumVal
        };
    })
)
但是,当我尝试通过以下特定操作使用上述EnumList.cshtml时:

@Html.Action("Enum", new { pState = Model.State });     <-- used in View html

// below action will be called by above method
[ChildActionOnly]
public PartialViewResult Enum(TestState? pState)
{
    return PartialView("~/Views/Shared/EditorTemplates/EnumList.cshtml", pState.HasValue ? pState.Value : TestState.eNone);
}

@Html.Action(“Enum”,new{pState=Model.State}) 首先,您使用的是错误的(来自帮助者DropDownList的MSDN描述):

使用指定的列表项为指定表达式表示的对象中的每个属性返回HTML select元素

您将其用于模型本身,而不是模型属性

解释为什么您的方法使用接受TestModel作为模型的视图,而不作为单独的部分视图使用:

默认情况下,编辑器模板为其输入生成id和名称属性,作为父前缀(请参见示例)与当前模型属性名称的组合。例如,当您使用
TestModel
作为视图的主模型,并使用
@Html.EditorForModel()
时,您选择的名称和id将是
状态

例如,如果您的
TestModel
ParentTestModel
的属性:

public class ParentTestModel
{
    public TestModel TestModelProperty {get;set;}
}
然后编辑器模板将呈现为

<select name="TestModelProperty.State" id="TestModelProperty_State">...

而不是
@Html.Action(“Enum”,新的{pState=Model.State})
使用
@Html.EditorFor(m=>m.State,“EnumList”)
关于下拉列表的问题太多了。
<select name="TestModelProperty.State" id="TestModelProperty_State">...
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, ModelMetadata metadata,
            string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool allowMultiple,
            IDictionary<string, object> htmlAttributes)
        {
            string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
            if (String.IsNullOrEmpty(fullName))
            {
                throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name");
            } ...