2016-09-13 2 views
0

私はAsp.Net MVC 5で標準の編集アクションを持っています。私は~/food/editのようなIDなしでリクエストを取得したときに未処理の例外をスローしないようにしたいので、これを行いました。編集アクションルートでAsp.Net MVC 5が未処理の例外をスローするのを防ぐにはどうすればいいですか?

public ActionResult Edit(int id = 0) 
    { 
     if (id == 0) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     string result = _foodAppService.GetById(id); 
     FoodVm food = string.IsNullOrEmpty(result) 
      ? null 
      : JsonConvert.DeserializeObject<FoodVm>(result); 

     if (food == null) 
     { 
      return RedirectToAction("Index"); 
     } 

     return View(food); 
    } 

私の質問は次のとおりです。これをこの方法で処理するのが良い方法ですか、より適切な方法がありますか?

私は別の方法で尋ねる必要がある場合は、私に知らせてください、あなたの時間をありがとう。その優れた

public ActionResult Edit(int? id) 
{ 
    if (!id.HasValue) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
} 
+1

まあ、ここで問題となるのは、必然的に何らかの意見が喚起され、それはスタックオーバーフローの範囲外だということです。代わりにコードレビューに質問をしたいかもしれません。 –

+1

アクションフィルタを作成し、それを目的のメソッドに適用するだけで済みます。また、intを初期化する必要はありません。intは自動的に0に初期化されます。どのようにして最初にこの状況に陥ることができますか?編集リンクを作成していませんか?ちょうど不器用なことを入力している人が心配ですか? – Fran

+0

@ChrisPratt、私はそのようなことがあることを知らなかった、私はちょうどそこにそれを投稿、ありがとう、私が言ったように:私はこの尋ねることに新しいです。 – PedroSouki

答えて

1

が有効である可能性があります。メソッドOnExceptionのオーバーライドを使用すると、1つのメソッドでコントローラ内のすべての例外をデバッグして処理することができます。また、ポールSwetzのsaiedとして入力パラメータの検証を使用し

public class BaseController : Controller 
{ 
    protected override void OnException(ExceptionContext filterContext) 
    { 
     string redirectUrl; 
     var exception = filterContext.Exception; 

     if (exception is EntityException) 
     { 
      redirectUrl = "/Content/error.html"; 
     } 
     else 
     { 
      redirectUrl = "/Info/Index"; 
     } 

     //do whatever you wont 

     Response.Redirect(redirectUrl); 
    } 

: はちょうどこのようなすべてのコントローラに基本クラスを追加します。この方法はより一般的であり、すべての例外を傍受することができ、ユーザーにエラーを表示しません。

0

を行うのか、MVCで例外を処理するために、より総合的な方法が存在することができた場合はゼロに

-1

まず、Try-Catchを使用するのがよい方法です。

public ActionResult Edit(int id) 
{ 
    try 
    { 
      if (id != 0 || id!=null) 
      { 
      string result = _foodAppService.GetById(id); 
      FoodVm food = string.IsNullOrEmpty(result) ? null:JsonConvert.DeserializeObject<FoodVm>(result); 

      if (food == null) 
      { 
       return RedirectToAction("Index"); 
      } 
      else 
      {  
      return View(food); 
      } 
      } 
     else 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
    } 
    catch (exception ex) 
    { 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
} 
+2

**あなたが本当に必要ない場合は、** DONT ** try tryを使用してください。それは本当に遅く、あなたのコードは本当に汚いです。 pls: https://msdn.microsoft.com/en-us/library/ms173162.aspx https://msdn.microsoft.com/en-us/library/ms173160(VS.80).aspx –

+0

加えて、あなたのtry/catchブロックは、決して例外をスローしないコードをカバーします。あなたが書いたものすべてをtry/catchブロックに入れるのは良い習慣ではありません。例外的な状況(彼らがすべきものです)のような例外を処理します。 – jwiscarson

+0

データベースからデータを取得する場合は、try catchを使用することは命を救うことです。あなたは何かがDBで間違っていることを知ることはありません。また、エラーログを記録するロガーを持つことも役に立ちます。 –

0

@Franのアドバイスに従います。

[MissingParam(ParamName="id")] 
public ActionResult Edit(int id) 

私はメソッドのパラメータを台無しにする必要はありませんその方法は、いずれかの検証が前に起こる:私はこれをしなかったアクションでMissingParam

public class MissingParamAttribute : ActionFilterAttribute 
{ 
    public string ParamName { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.ActionParameters.ContainsKey(ParamName)) 
     { 
     if (filterContext.ActionParameters[ParamName] == null) 
     { 
      filterContext.ActionParameters[ParamName] = 0; 
     } 
     } 

    base.OnActionExecuting(filterContext); 
    } 
} 

と呼ばれるアクションフィルタ属性を構築しました。この実装は、オープン/クローズの原則に従います。私はその機能を拡張しましたが、質問のコードのように変更されませんでした。

関連する問題