C# 由于表达式,部分视图中的DropDownListFor失败
我正在使用Visual Studio 2015社区版进行ASP.net MVC项目测试, 这是我的简单模型: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,
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");
} ...