调用Ajax.BeginForm和Html.BeginForm后,编辑器模板不起作用

时间:2012-02-24 04:09:51

标签: asp.net asp.net-mvc asp.net-mvc-3 razor mvc-editor-templates

我为枚举创建了一个编辑器模板,工作正常,直到我决定使用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

任何想法?

1 个答案:

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