0

Ajax.BeginFormを使用するまで、うまく動作していたenumのエディタテンプレートを作成しました。次のような定義があるstatusプロパティ:Ajax.BeginFormとHtml.BeginFormを呼び出した後、エディタテンプレートが機能しない

<DisplayName("Status")> 
<UIHint("enum")> 
Public Property status As String 

は、私はすでに、次のapproachsを試してみました:

@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)}) 

上記のいずれも機能しませんでした。 .BeginFormメソッドを呼び出した後

@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) 

を次のように

私のテンプレートのコードは、私のテンプレートがまだ呼ばれているが、私のテンプレート内のModelプロパティがnullです。

どのようなアイデアですか?

答えて

1

私はあなたのエディタのテンプレートを使用して、少なくとも4つの問題見ることができます:あなたは開口部IfなしEnd Ifを持って

  • をので、あなたのエディタのテンプレートが選択された値を決定するために例外
  • をスローする可能性があります列挙型の値を文字列と比較します。
  • ドロップダウンリストをレンダリングするときには、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 stringプロパティを列挙型の値に設定して、正しいオプションがドロップダウンリスト内で自動的に事前に選択されるようにします。

+0

すべてのポイントが正しいです。しかし、.. 1。'End If'は、簡略化のためにコードを切り捨てながら注意を払わなかった結果でした。 2.後ほど​​比較を修正しましたが、それは原因ではありませんでした。 3.' Model'を名前として使用するのもエラーでしたしかし、問題を引き起こしていない 'キャスト'(功績!)の一般化に本当に素敵なヒント 私は '.BeginForm'メソッドを呼び出していない場合、そのテンプレートは機能します。私が '.BeginForm'を使用している場合は、**私はOsを作成しているときに発生するnullモデルのドロップダウンをレンダリングするためにエディタに条件を追加する必要があります。 ありがとう! – svallory

関連する問題