我为枚举创建了一个编辑器模板,工作正常,直到我决定使用Ajax.BeginForm。属性status
具有以下定义:
<DisplayName("Status")>
<UIHint("enum")>
Public Property status As String
我已经尝试过以下方法:
@Using Ajax.BeginForm("New", "Os", Nothing)
@Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)})
End Using
@Ajax.BeginForm("New", "Os", Nothing)
@Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)})
@Using Html.BeginForm()
@Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)})
End Using
@Html.BeginForm()
@Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)})
以上都没有奏效。
我的模板代码如下
@ModelType String
@code
Dim options As IEnumerable(Of OsStatus)
options = [Enum].GetValues(ViewData("enumType")).Cast(Of OsStatus)()
Dim list As List(Of SelectListItem) =
(from value in options
select new SelectListItem With { _
.Text = value.ToString(), _
.Value = value.ToString(), _
.Selected = value.Equals(Model) _
}).ToList()
End If
End Code
@Html.DropDownList(Model, list)
调用.BeginForm
方法后,我的模板仍然会被调用,但我的模板中的Model
属性为null
。
任何想法?
答案 0 :(得分:1)
我的编辑器模板至少可以看到4个问题:
End If
没有开头If
,因此您的编辑器模板可能会抛出异常value.Equals(Model)
进行比较,而您应该将字符串与字符串进行比较:value.ToString().Equals(Model)
Model
值作为名称,而您应该使用空字符串,以便从父属性中为此下拉列表指定正确的名称。OsStatus
枚举相关联,因为您在其中投射它。最好让这个编辑器模板更通用,更可重复使用。这是正确的方法:
@ModelType String
@code
Dim options = [Enum].GetValues(ViewData("enumType")).Cast(Of Object)()
Dim list As List(Of SelectListItem) =
(From value In options
Select New SelectListItem With { _
.Text = value.ToString(), _
.Value = value.ToString(), _
.Selected = value.ToString().Equals(Model) _
}).ToList()
End Code
@Html.DropDownList("", list)
调用它的正确方法是:
@Using Ajax.BeginForm("New", "Os", Nothing)
@Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)})
End Using
或:
@Using Html.BeginForm("New", "Os", Nothing)
@Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)})
End Using
现在,在渲染此视图时,请确保控制器操作实际传递了模型,并将status
字符串属性设置为枚举中包含的某个字符串值,以便可以自动预选正确的选项在下拉列表中。