2012-02-16 6 views
0

@Kateによって提案された部分的な修正を反映するように更新されました。新しい投稿の下の元の投稿:HttpPostのASP MVC3 HandleError

私はHttpPostアクションメソッドにAjaxコールを持っています。メソッドが例外なく実行されている場合は、div要素の部分ビューとしてデータをロードします(正常に実行されます)。例外がある場合は、asp mvc Errorビューをフルページビューとして読み込みます。ただし、以下のコードでは、例外により、エラービューがdiv要素の部分ビューとして読み込まれます。私はコントローラから何かを離しておく必要があります...

[HttpPost] 
[HandleError] 
public ActionResult LoadUnmappedProjects() 
{ 
    bool error = false; 
    try 
    { 
     throw new ArgumentException(); 
    } 
    catch (Exception e) 
    { 
     error = true; 
    } 

    if (!error) 
     using (var db = new prismEntities()) 
     { 
      return PartialView(db.dmPSPProjectStatewideRegionals.ToList()); 
     } 
    else 
    { 
     return View("Error"); 
    } 
} 

アイデア??? ASP MVC3のウェブアプリで

ORIGINAL POST

、私はへのAJAX呼び出しと[HttpPost]アクションメソッドを持っています。このメソッドはデータベースをヒットし、データを部分ビューに返します。データベースまたは関心のあるテーブルがダウンしている場合、私はエラービューを返したいと思います。 Error.cshtmlがレンダリングされません

[HttpPost] 
    [HandleError] 
    public ActionResult LoadUnmappedProjects() 
    { 

     try 
     { 
      throw new ArgumentException(); 
     } 
     catch (Exception e) 
     { 
      throw new CustomDbException(e); 
     } 

     using (var db = new prismEntities()){ 
     return PartialView(db.dmPSPProjectStatewideRegionals.ToList()); 
     } 


    } 

株式:しかし、私はこれを達成するための方法で[のHandleError]兼ね備えているように見える[HttpPost]とすることはできません。代わりに、エラーがAjax呼び出しに返され、現在は警告()がポップアップしています。上記の方法でエラービューをレンダリングさせるために何かできることはありますか?または、エラービューをレンダリングするためにAjax呼び出しで返されたエラーを使用する必要がありますか?

$.ajax({ 
    url: pathLoadUnmappedProjects, 
    type: 'POST', 
    dataType: 'html', 
    contentType: 'application/json; charset=utf-8', 
    success: function (result) { 
     $('#unmappedProjects').html(result); 
    }, 

    error: function() { 

     alert("Error:"); 
    } 
}); 

答えて

1

問題はあなたのコードである:ここでは

は私のAJAX呼び出しです。例外をスローするので、自動的にプロセスを停止し、500エラーサーバーを返します(FirebugのNetタブで確認できます)。だから、私の提案はここに例外をスローすることはありません:

throw new ArgumentException(); 

You can something like that: 
try 
{ 
    ... 
} 
catch (Exception e) 
{ 
    error = true; 
} 
if (error) 
{ 
// render Error page 
} 

あなたには、いくつかのページにリダイレクトする必要がある場合はちょうどあなたがここで説明するようにリダイレクトし、JSのコードでそれをやりたいページ名を返すようにしてみてください。How to reload page when an ajax request returns FormsAuthentication.RedirectToLoginPage?

だからコードの意志は次のようになります。あなたが前に行ったように、あなたが例外を投げることができるし、Ajaxのコードはエラー応答をキャッチし、リダイレクトします。この場合、

error: function() { 

     window.location.href = "Error/Index"; 
    } 

+0

問題の解決済みの部分ですが、すべてではありません。アクションメソッドは正常に実行されますが、エラービューを部分ビューとして返します...ページ全体としてレンダリングします。私は何か他のものがありません... – rgwozdz

+0

あなたのAjaxリクエストの一部として、または他のページにリダイレクトしたいというエラーページのレンダリング方法を指定してください。 – Kath

+0

答えの更新を参照してください。 – Kath

0

あなたはAjax呼び出しを行っているときと同じように、LoadUnmappedProjectsアクションからそれを達成できるとは思いません。あなたのケースでは、戻ってきたエラーページは通常のページとして扱われ、したがって、あなたのajaxビットの '成功'部分が実行されます。

Exceptionの場合はフラグ(コード、空文字列など)を返すようにして、「成功」セクションでそれを確認してエラーページにリダイレクトしてくださいそれはjQueryからです)。

0

ステータスコードを500に戻して、AJAXコールでエラーを処理させることもできます。

あなたの行動:

public ActionResult LoadUnmappedProjects() 
{ 
    bool error = false; 
    try 
    { 
     throw new ArgumentException(); 
    } 
    catch (Exception e) 
    { 
     error = true; 
    } 

    if (!error) 
     using (var db = new prismEntities()) 
     { 
      return PartialView(db.dmPSPProjectStatewideRegionals.ToList()); 
     } 
    else 
    { 
     Response.StatusCode = 500; 
     return View("Error"); 
    }  
} 

、その後、あなたのAJAX呼び出し:

$.ajax({  
    url: pathLoadUnmappedProjects,  
    type: 'POST',  
    dataType: 'html',  
    contentType: 'application/json; charset=utf-8',  
    success: function (result) {  
     $('#unmappedProjects').html(result);  
    },  

    error: function (xhr, ajaxOptions, thrownError) { 
     $('html').html(xhr.responseText); 
    }  
}); 

私は自分自身には、エラーを処理し、いくつかのメッセージを表示しない、完全なエラーページを表示するが、選択はあなた次第ですでしょう。ケイトの答えはまた、エラーページのものになるようにURLを変更しています。

+0

あなたのソリューションをありがとう、それはまた非常に有用です。 – rgwozdz