[解決済み] MVC 3:ajax経由でロードされたときに、そのレイアウトページなしでビューをレンダリングするにはどうすればよいですか?
質問
について学んでいます。 プログレッシブ・エンハンスメント で、ビューのAJAX化について質問があります。私のMVC 3プロジェクトでは、レイアウトページ、ビュースタートページ、および2つのプレーンなビューがあります。
viewstart ページは Views フォルダのルートにあり、したがってすべてのビューに適用されます。このページでは、すべてのビューで
_Layout.cshtml
をレイアウトページに使用します。レイアウトページには2つのナビゲーションリンクがあり、各ビューに1つずつあります。リンクは
@Html.ActionLink()
を使用して、ページへのレンダリングを行います。
今度はjQueryを追加して、これらのリンクをハイジャックし、Ajaxを使ってページ上に動的にコンテンツをロードしたいと思います。
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
これには2つの方法が考えられますが、私はどちらも特に好きではありません。
1) ビュー全体のコンテンツを部分ビューに配置し、メインビューがレンダリングされるときに部分ビューを呼び出すようにすることができます。この方法では
Request.IsAjaxRequest()
をコントローラの中で返すことができます。
View()
または
PartialView()
は、リクエストがAjaxリクエストであるかどうかに基づいています。Ajaxリクエストに通常のビューを返すことはできません。そうすると、レイアウトページを使うことになり、レイアウトページの2番目のコピーが注入されるからです。しかし、これでは、単に
@{Html.RenderPartial();}
を、標準的なGETリクエストのために使用します。
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
そして、Index.cshtmlでは次のようにしてください。
@{Html.RenderPartial("partialView");}
2) Ajaxでない場合は、_viewstartからレイアウト指定を外し、手動で指定することができますね。
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
どなたか、もっと良いご提案はありませんか?レイアウトページのないビューを返す方法はないでしょうか?それがajaxリクエストである場合、それがajaxでない場合、レイアウトを明示的に含めることよりも、"don't include your layout"と明示的に言う方がずっと簡単でしょう。
解決方法は?
で
~/Views/ViewStart.cshtml
:
@{
Layout = Request.IsAjaxRequest() ? null : "~/Views/Shared/_Layout.cshtml";
}
とコントローラの中にあります。
public ActionResult Index()
{
return View();
}
関連
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み] Razor View Page で名前空間をインポートするにはどうしたらいいですか?
-
[解決済み] ASP.NET MVCのビューを文字列としてレンダリングする方法は?
-
[解決済み】MVC 3で現在のページのURLを取得する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】画像のペイントにTextureBrushを使用する方法