Шаблон редактора не работает после вызова Ajax.BeginForm и Html.BeginForm - PullRequest
0 голосов
/ 24 февраля 2012

Я создал шаблон редактора для перечислений, который работал нормально, пока я не решил использовать 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 Ответ

1 голос
/ 24 февраля 2012

Я вижу по крайней мере 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 установлено некоторое строковое значение, которое содержится в нем.в перечислении, чтобы в раскрывающемся списке автоматически был предварительно выбран правильный параметр.

...