0

我爲枚舉創建了一個編輯器模板,它工作正常,直到我決定使用Ajax.BeginForm。 status具有以下定義的屬性:編輯器模板在調用Ajax.BeginForm和Html.BeginForm後無法工作

<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

我可以看到至少4個問題與你的編輯器模板:

  • 你有一個End If沒有開口If所以你的編輯模板很可能會拋出異常
  • 爲了確定所選擇的值你將一個枚舉值與一個字符串進行比較:value.Equals(Model)而你應該將字符串與字符串進行比較:value.ToString().Equals(Model)
  • 當渲染你的下拉列表時,你使用的是Model值作爲名字,而你應該使用空st爲了使這個下拉列表的父屬性具有正確的名稱,
  • 當您在其中投射時,您的編輯器模板現在與枚舉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將字符串屬性設置爲包含在枚舉中的某個字符串值,以便可以在下拉列表中自動預先選擇正確的選項。

+0

你是對的每一點。但是.. 1。'End If'是在簡化代碼時不注意的結果 2.我稍後修改了比較,但那不是原因 3.使用'Model'作爲名稱也是一個錯誤但並沒有造成問題 真的很好的提示'鑄造'的概括(榮譽!) 我不知道爲什麼,但總之,如果我不調用'.BeginForm'方法,該模板起作用。如果我正在使用'.BeginForm' **我必須**在編輯器上添加一個條件來渲染空模型的下拉列表,這在我創建一個Os時發生。 謝謝! – svallory 2012-02-24 23:05:18