web-dev-qa-db-ja.com

MVCでの部分ビューのレンダリング

部分ビューの操作に慣れていません。その背後にある理由は、私には本当にJquery/JS/Ajaxの基本がないためです。しかし、私は最近、一部のSOポストを介して、AJAX Unobtrusiveを使用して部分ビューをレンダリングできることを発見しました。ポストのメソッドは、Ajaxを使用して本当に単純であるようですヘルパーメソッド。

しかし、Partialビューのレンダリングについて助けを求めている多くの同様の投稿に出くわしました。しかし、ほとんどがスクリプトを使用して同じものをレンダリングすることを提案しています。

人々が控えめなAJAXを決して提案しなかった理由は何ですか。 (私の場合、私はUnobtrusive AJAXを使用してそれを正しく理解したことはありませんが、私はそれがUnobtrusive Ajaxの問題ではないと私は強く信じています)。

部分ビューのレンダリングに関する提案を探しています。 1か月で完了するプロジェクトがあります。私は誰かが私の仕事を成し遂げるためにいくつかの簡単な方法を提案することを望みます。

2
Vini

部分的なビューをレンダリングしたい場合が2つあります。

  1. 同期的に、より大きなビューのレンダリングの一部として

    例えば/ Widgets/Details /をレンダリングするときに呼び出されるビューには、次のようなRazorコードが含まれている可能性があります

    &ltdiv class = "subwidget"> 
     @ Html.Partial( "_ Subwidget"、Model.Subwidget)
     </ div> 
    

    これにより、_Subwidget.cshtmlがレンダリングされ、現在のビューのウィジェットのSubwidgetプロパティが渡されます。これにより、大きなビューを分割して管理しやすくし、コードを複製することなく他のビューで_Subwidgetビューをレンダリングできます。

  2. 非同期的に、部分ビューが、コントローラーメソッドの呼び出しから返されるコンテンツ全体である場合。

    例えばページはすでにクライアントデバイス上にありますが、このjQueryコードが含まれています

     $。get( '/ Widgets/Subwidget/300')
    

    GETをWidgetsコントローラーに送信し、Subwidget(300)を呼び出します。 Subwigetアクションは、レイアウトやその他のものを含めたくありません。必要なのは、データのみ(HTMLフラグメント、JSON、または単なる文字列の場合もある)を返すことだけです。

    サブウィジェットアクションは次のようになります。

     public ActionResult Subwidget(int Id)
     {
     var subwidget = _widgetGateway.Subwidget(Id); 
     return PartialView( "_ Subwidget"、subwidget); 
    } 
    

    その時点でそれを処理するのは、ページ上のJavaScriptコード次第です。

部分ビューはブラウザに送信される結果にすぎないことを覚えておくことが重要です。アクションは、標準のコントローラーアクションが実行できるすべてのことを実行できます。 POST、PUT、またはDELETEの形式でデータを受け入れる場合は、アクションで作業を行うこともできます。

[HttpPost]
public ActionResult SubmitSubwidget(Subwiget sub)
{
  _widgetGateway.Save(sub);      
  return PartialView("_Subwidget", sub);
}

実際、コンテンツをブラウザに返す必要はまったくありません。呼び出しが成功したかどうかを知りたいだけの場合は、HTTPステータスコードを送信できます。

[HttpPost]
public ActionResult SubmitSubwidget(Subwiget sub)
{
  if(_widgetGateway.Save(sub))
    return new HttpStatusCodeResult(200, "Submitted");
  else
    return new HttpStatusCodeResult(500, "Submission failed");
}
3
Greg