この質問はこれに関連していますが、私の例では、答えを変える可能性のある詳細があると思います。
特定のユーザーに関するデータを表示するためのビューをレンダリングするコントローラーにユーザーアクションがあるとすると、次のUserViewModel
ようになります。
public class UserViewModel {
public string FirstName;
public string LastName;
etc...
}
ただし、このビューでは、このユーザーデータを表示するだけでなく、このページで別のユーザーを検索できるように、ユーザーの検索テキストボックスが必要です。このフォームは、次のモデルを受け入れるFindUserのアクションに投稿されます。
public class FindUserInputViewModel {
[Required]
public string SearchQuery;
}
このアクションでモデルが無効であることが検出されると、ModelStateを維持したまま、Userアクションにリダイレクトされます。
現在、検証エラーを表示するために、その検索クエリプロパティが含まれていないため、強く型付けされたヘルパーを使用できませんUserViewModel
。これを行う必要があります。
@Html.TextBox("SearchQuery")
@Html.ValidationMessageFor("SearchQuery")
これは機能し、エラーが表示され、POSTされた古い値が表示されます(ModelStateに保持されているため)。ただし、可能な限り、強く型付けされたヘルパーを使用したいと思います。
私が見たすべての例から、ここでのパターンは、おそらくプロパティUserViewModel
として、その中にFindUserInputViewModelが含まれている必要があるということのようです。FindUserInput
その後、私は次のことができます。
@Html.TextBoxFor(m => m.FindUserInput.SearchQuery)
これは、FindUserアクションが正しいプレフィックスにバインドされていることを確認するか、TextboxForメソッド呼び出しで名前を指定する限りも機能します。
ただし、このヘルパーを使用して検証をバインドする場合にのみ、UserViewModelにこの他のViewModelを含める必要がある理由がわかりません。それは私が見ていない他の利点をもたらしますか?ビューのモデルが、通常の編集アクションなど、投稿しているのと同じデータをレンダリングする必要がある場合の使用法を理解していますが、ここではそうではありません。
ここで便利なのは、次のような別のタイプを参照できる別の汎用ヘルパーであるように私には思えます。
@Html.TextBoxForType<FindUserInput>(m => m.SearchQuery)
これは存在しませんが、私はそれを書くことができるはずだと思います、そしてこれはその良い例です。それは適切な解決策のように聞こえますか、それとも私はここで何かを逃していますか?
もう1つのオプションは、おそらく、投稿用の小さなフォームにFindUserInputViewModel
POSTだけでなく独自のGETアクションが必要であり、ユーザービューはを使用してそれを呼び出すことができるということ@Html.Action
です。次に、に強く型付けされただけの部分ビューをレンダリングできますFindUserInputViewModel
。