0

我为枚举创建了一个运行良好的编辑器模板,直到我决定使用 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.

有任何想法吗?

4

1 回答 1

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字符串属性设置为包含在枚举中的某个字符串值,以便可以在下拉列表中自动预先选择正确的选项。

于 2012-02-24T07:15:12.157 回答