2016-10-07 6 views
2

MVCアクションから戻されるビューに応じて部分ビューがロードされるdivを設定する方法はありますか?たとえば、MVCコントローラアクションは、いくつかのロジックに応じて2つのビュー(View AまたはView B)のいずれかを返すことができます。 'View A'が返されると、Ajax呼び出しのdone関数で 'div A'にロードされますが、 'View B'が返された場合は 'div B'にロードされます。MVC Ajaxの部分ビュー - どのビューが返されるかによって異なるdivにロードする

public ActionResult SomeActionMethod() 
{ 
    if (someCondition == true) { 
     return PartialView("ViewA", new SomeModel()); 
    } 
    else { 
     return PartialView("ViewB", new AnotherModel()); 
    } 
} 
.done(function(data) { 
    if (isViewA === true) { // How do I determine which view it is? 
     $('#div-a').html(data); 
    } else { 
     $('#div-b').html(data); 
    } 
}) 

これは(それがビューAまたはビューBかどうかを決定するために)行うには知られて/受け入れられた方法はありますか?私はこれを行う2つの方法を考えましたが、どちらもちょっとハッキリしているようです。これを行うための一般的に受け入れ/承認された方法は何がある場合は、次のアイデアがありません大丈夫...

アイデア1:

検索は、そのビューで見られるユニークな要素や隠し入力値のHTMLを返さ。これは返されるデータが単純なhtmlではなく、ネストされた文字列/オブジェクト(実際にはわからない)の一種であるため、最初に聞こえるほど簡単ではありません。最上位要素の場合は、jQueryの 'filter'メソッドを使用する必要があります。それ以外の場合は、 'find'メソッドを使用してください。

アイデア2:コントローラのアクションで

、(ビューA)返されるビューのいずれかのために、既に使用されていない200の範囲のカスタム値にResponse.StatusCode設定(ありません200-208,226)。次に、ajax done関数で、3つのパラメータをすべて指定し、コントローラのアクションで設定した応答ステータスと比較するために、3番目のパラメータstatusプロパティを確認します。

if (someCondition == true) { 
    Response.StatusCode = 299; 
    return PartialView("ViewA", new SomeModel()); 
} 
else { 
    return PartialView("ViewB", new AnotherModel()); 
} 
.done(function(data, textStatus, jqXHR) { 
    if (jqXHR.status === 299) { 
     // It’s View A so load it into div A 
    } 
    else { 
     // It’s View B so load it into div B 
    } 
}) 

これは魔法のように動作しますが、さらに多くのハックアイデア1より

+1

1つのオプションは、([この答え]を参照(http://stackoverflow.com/questions/4730777/mvc-return-partial-view-as-json))ようにJSONとしてビューを返すことですビューとそれを表示する別の値の両方を返すことができるので、 'if(data.ViewName == ??){...'のようなものを使うことができます –

+0

レイアウトやビューで 'someCondition'を評価できますか?もしそうなら、あなたはビューから 'RenderAction'を呼び出すことができ、二つの別々のコントローラを持つことができます。 – Khyron

+0

@Khyronあなたが正しく言ってもらいたいと分かっていれば、RenderActionはAjax呼び出しで返されるビューに影響を与えますが、どのdivにロードするかを判断するのに役立ちません。 –

答えて

0

Iそれぞれが個別にDIVのコンテンツをロードすることをお勧めらしいです。例えば:あなたはJSONオブジェクトとしてレンダリングしたいの表示を決定するためにPartialViewとパラメータを返すことができ

Javascriptを

$('div-a').html(contentforA); 
$('div-b').html(contentforB); 

コントローラ

public ActionResult ContentA() 
{ 
    if (someCondition) 
    { 
     return PartialView("ViewA", new SomeModel()); 
    } 
    return new EmptyResult(); 
} 

public ActionResult ContentB() 
{ 
    if (!someCondition) 
    { 
     return PartialView("ViewB", new AnotherModel()); 
    } 
    return new EmptyResult(); 
} 
+0

div Aとdiv Bには既にコンテンツが含まれているので、両方を置き換えると、いいえではないEmptyResultが得られます。特に、私は新しいコンテンツをまったく変えないようにしたいからです。 –

+0

この場合、それぞれのcontenforXが空でない場合、各divのコンテンツを置き換えます。例: 'if(contentforA)$( 'div-a').html(contentforA);' – Khyron

0

public ActionResult LoadView() 
{ 
    if (someCondition == true) 
    { 
     return Json(new { Url = Url.Action("PartialA",new SomeModel()), viewName = "PartialA"}); 
    } 
    else 
    { 
     return Json(new { Url = Url.Action("PartialB", new AnotherModel()), 
    viewName = "PartialB"}); 
    } 
} 

https://stackoverflow.com/a/10266520/6842997

このビューでは、結果が得られたら、ajax投稿を行うことができます。

$.post(result.Url, function (partial) { 
     $('#div-a').html(partial); 
}); 

コントローラー内の各PartialViewにPartialViewResultsを追加します。

public PartialViewResult PartialA(SomeModel model) 
{ 
    return PartialView(); 
} 

public PartialViewResult PartialB(AnotherModel model) 
{ 
    return PartialView(); 
} 

あなたのjsでこのようなことをしてください。

<input type="submit" onclick="load()" value="submit" /> 

function load() { 
    $.ajax(
    { 
     type: "POST", 
     url: "@Url.Action("LoadView", "Home")", 
     data: "", 
     success: function (result) { 
      if (result.viewName == "PartialA") { 
       $.post(result.Url, function (partial) { 
        $('#div-a').html(partial); 
       }); 
      } else { 
       $.post(result.Url, function (partial) { 
        $('#div-b').html(partial); 
       }); 
      } 
     } 
     }); 
    } 
関連する問題