ASP.NET MVCを使用してコントローラーからユーザーコントロールビューにデータを渡す
-
03-07-2019 - |
質問
Viewクラス(OrderView.aspx)があり、これは注文の詳細(アカウント名、注文日)およびRepeaterコントロール経由の注文明細のリストを表示します。各注文明細は、注文明細の詳細(アイテム名、数量、価格)を示すユーザーコントロールビュー(OrderLineView.ascx)で表されます。このすべてのデータソースとして使用するOrderというモデルオブジェクトがあり、ビューのモデルオブジェクトとして渡します。
各OrderLineViewユーザーコントロールには、[保存]ボタンと[削除]ボタンがあります。 OrderLineコントロール内のフォームのコンテンツをコントローラーのSaveメソッドにポストし、RedirectToActionを同じOrderページに戻す[Save]ボタンがあります(ページ全体が更新され、AJAXyは何も更新されません)。削除しようとするコントローラーのメソッドにリンクする[削除]ボタンがあり、RedirectToActionを同じ注文ページに戻します。ただし、削除が失敗した場合、ページが再び表示されるときに削除ボタンの横に小さなエラーメッセージを表示する必要があります(ページのすべての注文行に削除ボタンがあるため、私がクリックしたもの)。私の質問:
1-このメソッドをコントローラーメソッドから特定のユーザーコントロールに渡すにはどうすればよいですか?どういうわけかそれをモデルに追加する必要がありますか?悪いアイデアのようです(実際にはモデルの一部ではないため)。
2-OrderLine操作用のOrderLineControllerとOrder操作用のOrderControllerが必要ですか?ベストプラクティスがビューごとに個別のコントローラーを使用することであるかどうかを知りたいだけです。
3-一部の人々が、次のような匿名型の値でRedirectToActionを呼び出す方法を見てきました。
RedirectToAction("ViewOrder", new { Id = 1234, Message = "blabla"});
ただし、これにより、メッセージ値がURL文字列に表示されます。私はそれで問題ありませんが、可能であれば表示しないことを望みます。
4-また、ビュー内からモデルのプロパティにアクセスするために、私は常にこれを実行していることに気付きます:
foo(((someModelType) this.ViewData.Model).SomeProperty);
これはいくつかの理由で好きではありません。その理由の1つは、ビューをモデルのタイプと結合させたくないという事実です(これがViewPageの代わりにViewPageを使用している理由です) 。次のような電話をかけたいと思っています。
foo(ModelEval("SomeProperty"));
そのようなことはありますか?私は自分で書きましたが、必要がなければそれを望みます。
解決
1
ModelStateをチェックアウトします。
ViewData.ModelState.AddModelError("something.Name", "Please enter a valid Name");
ModelStateは実際には辞書であるため、コントロールごとにエラーを識別できます。これがベストプラクティスかどうかはわかりませんが、おそらくうまくいくでしょう。
の線に沿って何かを試してくださいViewData.ModelState.AddModelError("something#3.Name", "Please enter a valid Name");
そしてあなたの意見では、あなたは置くことができます
<%= Html.ValidationMessage(string.format({"something{0}.Name", YourUniqueId))%>
4
ビューを強く入力できるので、そのキャストは必要ありませんが、密結合が心配な場合は、先送りになる可能性があります。しかし、強い型を持つことは、とにかくモデルのそのプロパティをマジックストリングのポイントを持つことほど密に結合されません。前者は、タイプセーフティとインテリセンスである栄光を提供します。
他のヒント
OrderLineには一意のIDがあるため、それを使用してModelStateエラーコンテナーに配置するキーを作成できます。
public ActionResult Delete(int? Id)
{
ModelState.AddModelError("OrderLine" + Id.Value, "Error deleting OrderLine# " + Id.Value);
...
}
そしてValidatinoMessageヘルパーを使用します。これは、ModelStateをチェックしてエラーが存在するかどうかを確認し、存在する場合はメッセージを表示します。それ以外の場合は空白です。
<%= Html.ValidationMessage ("OrderLine" + Id)%>
MVCモデルの次のリリースでは、トップレベルのプロパティになるため、次のようになります
foo(((someModelType) this.ViewData.Model).SomeProperty);
と書くことができます
foo(Model.SomeProperty);
プロパティとして publicオブジェクトを使用していない限り、モデルオブジェクトは既に入力されている必要がありますか?