2017-03-27 11 views
2

Ajax呼び出しで部分ビューを返し、それがページリフレッシュであればレイアウトとレンダリングで返すアプリケーションを作成したいスクリプト。しかし、問題は、部分的なビューはセクションが表示されませんで、そのために私はようにApp_CodeにMVCヘルパーを作成しました:Asp.Net MVCヘルパー:レイアウトの有無にかかわらずビューを読み込むためのグローバルヘルパーを作成する

@helper AddSection(Func<object, object> content) 
{ 
    if (IsAjaxRequest) 
    { 
     @content(null); 
    } 
    else 
    { 
     @section scripts { 
      @content(null); 
     } 
    } 
} 

私は私の見解では、それを呼び出していたとき、私は怒鳴るエラーを取得しています:

CS0103: The name 'DefineSection' does not exist in the current context 
Line 71: #line hidden 
Line 72: DefineSection("scripts",() => { 
Line 73: 

私は多くのことを試みましたが、このエラーはまだありますが、私は多くを探しましたが、解決策を見つけることができませんでした。

+0

これを行うには、同じ操作を2回呼び出す必要があります。 1回は標準リクエストを受け取り、もう1回はxhr ajaxリクエストを使用しますか? – JoeJoe87577

+0

はい、正確に... – CuriousGeek

答えて

2

私は多くを検索し、ヘルパー内のセクションが不可能であることを発見しました。下記のリンクされています

https://stackoverflow.com/a/22977735/5179246

@helperと@section構文は、ページをコンパイルするための特別なディレクティブです。

HelperResult(ヘルパー)は、セクションの定義方法を知らない。

DefineSectionメソッドはWebPageBaseに属します。

これは別の方向から来る必要があります。ヘルパーの代わりに部分的なビューを使用すると、おそらくこの問題が解決されます。

ネストされたレイアウトを使用することができます。内側のレイアウトは、本体とスクリプトをレンダリングするだけです。

0

questionで説明されているように)リクエストヘッダーを確認できます。 X-Requested-Withを確認し、XMLHttpRequestと記載されている場合はXHR(Ajax)リクエストにする必要があります。

コントローラでは、同じ方法でPartialViewを返すことができます。あなたのビュー内

public ActionResult YourAction() 
{ 
    Boolean IsAjax = false; //check the request header 

    if (IsAjax) 
    { 
     ViewBag.UseLayout = false; 
     return PartialView("PartialView"); 
    } 
    else 
    { 
     return View("View"); 
    } 
} 

あなたがViewBag.UseLayoutを読み、すべてのセクションでかいない完全なレイアウトをレンダリングすることを決定することができます:

@{ 
    if (ViewBag.UseLayout == null || ViewBag.UseLayout) { 
     Layout = "~/Views/Shared/_Layout.cshtml"; 
    } 
    else { 
     Layout = null; 
    } 
} 

あなたはそうViewBagのヌルチェックして、ViewStart.cshtmlにそれを拡張することができこれはすべてのビューに適用されます。

+0

私は既に部分的なビューをロードするかどうかを知っていましたが、部分的であれば問題は、セクションをレンダリングせずにスクリプトセクションをロードしたいのですが、フルビューセクションをレンダリングする必要があります。 – CuriousGeek

+0

私はそれがサーバーからajax呼び出しを介して直接部分的なビューをロードすると思いません.... –

+0

ビュー(ajaxの応答)に戻って、ビューからpartilalビューをロードする必要があります。 –

関連する問題