2009-02-23 2 views
19

ショート:
コントローラに現在のビューを返すか、単に何もしないでください。HOW?コントローラは何も返しません/現在のビュー

LONG:
私はイメージライダーを作成しました。 次の画像を取得するためにコントローラに要求を送信するリンクが含まれています(ajaxを使用)。 コントローラは、次のイメージをフェッチしてViewDataに格納し、部分ビュー(上記のもの)を送り返します。

現在、コントローラが最後のイメージに到達すると、コントローラは同じイメージを(再フェッチすることによって)リターンしますが、まだ新しいビューを作成します。つまり、クライアント/ブラウザが再解析されます。 「同じ」データ。
これは多少最適ではないようです。

私がしたいのは、コントローラが最後の画像に達すると、何もしないことです。
nullを返した場合、ビューは空の内容で更新されます。
私はビュー/クライアント/ブラウザには、何も保持し、コントローラは単に何もしないようにします。

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult GetNextImage(...) 
    { 
     if(Request.IsAjaxRequest()) 
     { 
      if(CURRENT_IMAGE != LAST_IMAGE) 
      { 
       Image image = GetNextImage(...); 
       var partialViewResult = new PartialViewResult(); 
       partialViewResult.ViewName = "ImageSlide"; 
       partialViewResult.ViewData.Model = image; 
       return partialViewResult; 
      } 
      else 
      { 
       // DO NOTHING, HOW? 
      } 
     } 

     return RedirectToAction("Error", "Home"); 
    } 
+0

のおかげで、しかし、応答なし...私は以前それを考えていなかったと信じてすることはできません。下の1つは、私が好きではない、さわやかなページです。私のjavascript/jqueryがユーザーインターフェイスを更新したので、コントローラが何らかのタスクの実行に成功したかどうかを確認するフラグが必要なUIを更新するためのサーバー側からは何もありません。はいの場合は、javascript/jqueryでUIを更新し、そうでない場合はチェックマークなどの特定のものを再度更新します。それ以外のページのコンテンツは、ユーザーアクションのためにjavascriptの変更を殺すリフレッシュ効果なしでそのまま残しています。以下のans。それは空白のビューを返すように動作しません。 – AKS

答えて

24

あなたはそれが何もしないようにしたい場合は、あなたがAjaxHelperを使用している場合は、失敗したステータスコード(例えば404を供給することにより、更新を回避することができます

return new EmptyResult(); 

... EmptyResultを返すことができます。または何でも最も適切である)、それが明示的にどの要素を更新する前に正常な応答をチェックすることがMicrosoftMvcAjax.jsではJavaScriptとしてあなたのdivを交換停止されます: -

this.ControllerContext.HttpContext.Response.StatusCode = 404; 
return new EmptyResult(); 

最終的にそれを避ける最善の方法は、最初の場所で問題を回避するように部分ビューを設計することです(あなた自身のように)。

+2

まあ、それは何かを行う、それは空の結果を返します。 nullを返すのと同じです。 これは単に空のコンテンツを表示します。 それは私がしたいことではありません。 私はそれを..ええ..何もしないで、救済し、現状のままにしておきます。 更新しません。 :) –

+0

AJAX経由で呼び出すので、XMLHttpRequestからの応答を受け取る必要がありますか?成功のコールバックで結果の長さをチェックし、0より大きい場合は内容を新しいHTMLフラグメントに置き換えます。そうでない場合はそのままにしておきます。 –

+0

私は "組み込みの" ajaxを使用しています: <%= Ajax.ActionLink( "次へ"、 "GetNextImage"、 "イメージ"、新しい{...}、 新しいAjaxOptions {InsertionMode = InsertionMode.Replace、私の視点の結果が平文に変更されました。(UpdateTargetId = "ImageDiv"))%> ぎこちないjavascriptingなどを必要としない単純なソリューションを期待していました –

0

MicrosoftMvcAjaxを使用していると仮定すると、スライダの最後に到達したことをユーザーに警告するJavascriptResultを返すことができます。レスポンスがコンテンツではなくjavascriptである場合、MicrosoftMvcAjaxハンドラはDOMコンテンツを置き換える代わりにレスポンスを実行します。

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult GetNextImage(...) 
{ 
    if(Request.IsAjaxRequest()) 
    { 
     if(CURRENT_IMAGE != LAST_IMAGE) 
     { 
      Image image = GetNextImage(...); 
      var partialViewResult = new PartialViewResult(); 
      partialViewResult.ViewName = "ImageSlide"; 
      partialViewResult.ViewData.Model = image; 
      return partialViewResult; 
     } 
     else 
     { 
      return JavaScript("alert('No more images');"); 
     } 
    } 

    return RedirectToAction("Error", "Home"); 
} 

もちろん、もっと創造的で、警告ではなくjQueryダイアログプラグインなどを使用したいと思うでしょう。

+0

'return JavaScript(" alert( 'イメージはありません); '警告( 'これ以上の画像はありません)'、 – Mans

0

わかりました。
私の質問に対する解決策ではありませんが、まだ問題を解決しています。

ビューに最後の画像が表示されているときは、単に「次へ」リンクを表示しません。

はまだ

ちょうど私が探しています何のようなあなたの努力の連中

関連する問題