web-dev-qa-db-ja.com

actionResultでエラーメッセージを返す

MVCアプリ、クライアントがサーバーに要求を行い、エラーが発生し、クライアントにメッセージを送り返したい。 HttpStatusCodeResultを試しましたが、メッセージなしで404を返すだけです。エラーの詳細がクライアントに返される必要があります。

public ActionResult GetPLUAndDeptInfo(string authCode)
{
    try
    {
        //code everything works fine
    }
    catch (Exception ex)
    {
         Console.WriteLine(ex.Message);
         return new HttpStatusCodeResult(404, "Error in cloud - GetPLUInfo" + ex.Message);
    }
}
30
John

ユーザーにわかりやすいエラーメッセージがあるビューを返す必要があります

catch (Exception ex)
{
   // to do :log error
   return View("Error");
}

例外の内部詳細(例外スタックトレースなど)をユーザーに表示しないでください。関連する情報をエラーログに記録して、問題を解決できるようにしてください。

リクエストがajaxリクエストの場合、適切なステータスフラグを含むJSONレスポンスを返すことができます。クライアントはこれを評価し、さらにアクションを実行できます

[HttpPost]
public ActionResult Create(CustomerVM model)
{
  try
  {
   //save customer
    return Json(new { status="success",message="customer created"});
  }
  catch(Exception ex)
  {
    //to do: log error
   return Json(new { status="error",message="error creating customer"});
  }
} 

ユーザーが送信したフォームにエラーを表示する場合、ModelState.AddModelErrorなどのHtmlヘルパーメソッドと一緒にHtml.ValidationSummaryメソッドを使用して、送信したフォームでユーザーにエラーを表示できます。

28
Shyju

1つのアプローチは、ModelStateを使用することです。

ModelState.AddModelError("", "Error in cloud - GetPLUInfo" + ex.Message);

そして、ビューで次のようなことをします:

@Html.ValidationSummary()

エラーを表示する場所。エラーがない場合は表示されませんが、エラーがある場合はすべてのエラーをリストするセクションが表示されます。

20
Mike Perrenoud

Controller Action内でHttpContext.Responseにアクセスできます。そこで、次のリストのように応答ステータスを設定できます。

[HttpPost]
public ActionResult PostViaAjax()
{
    var body = Request.BinaryRead(Request.TotalBytes);

    var result = Content(JsonError(new Dictionary<string, string>()
    {
        {"err", "Some error!"}
    }), "application/json; charset=utf-8");
    HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
    return result;
}
10
Alexey Matveev

ビューの挿入で

@Html.ValidationMessage("Error")

モデルでnewを使用した後、コントローラーで

var model = new yourmodel();
try{
[...]
}catch(Exception ex){
ModelState.AddModelError("Error", ex.Message);
return View(model);
}
5
theLaw