3

私は2つのコントローラーを持っています:

public class AController : Controller
{
      public ActionResult AControllerAction()
      {
          if (// BControllerAction reported an error somehow )
          {
                ModelState.AddModelError("error-key", "error-value");
          }
          ...
      }
}

public class BController : Controller
{
      public ActionResult BControllerAction()
      {
          try{Something();}
          catch(SomethingExceprion)
          {
              // here I need to add error info data,
              // pass it to AController and redirect to
              // AControllerAction where this error will be added 
              // to model state
          }
      }
}

私は次のようなことができると思います:

public ActionResult BControllerAction()
{
     try{Something();}
     catch(SomethingException)
     {
         var controller = new AController();
         controller.ModelState.AddModelError("error-key", "error-value");
         controller.AControllerAction();
     }
}

しかし、それはアーキテクチャを壊すアプローチになることをお勧めします。私はそのようなことはしたくありません。モデルオブジェクトを渡す以外に、より簡単で安全な方法はありますか?

4

2 に答える 2

3

コントローラー A に戻す必要がある例外の詳細に応じて、次のようなことを行います。

public ActionResult BControllerAction()
{
     try{Something();}
     catch(SomethingException ex)
     {
         return RedirectToAction("AControllerAction", "AController", new { errorMessage = ex.Message() })
     }
}

そして、呼び出されたメソッドの署名を次のように変更します

public ActionResult AControllerAction(string errorMessage)
      {
          if (!String.IsNullOrEmpty(errorMessage))
          {
                //do something with the message
          }
          ...
      }
于 2013-01-07T16:12:58.737 に答える
2

AControllerAction にリダイレクトを返すことができます。TempData ディクショナリ (ViewData と同様) を使用して、このような呼び出しでデータを共有できます (このブログ投稿で説明されているように、この方法で保存されたデータは同じセッションの次の要求まで保持されます)。

例:

public class AController : Controller
{
      public ActionResult AControllerAction()
      {
          if (TempData["BError"] != null)
          {
                ModelState.AddModelError("error-key", "error-value");
          }
          ...
      }
}

public class BController : Controller
{
      public ActionResult BControllerAction()
      {
          try{Something();}
          catch(SomethingExceprion)
          {
              TempData["BError"] = true;
              return RedircetToAction("AControllerAction", "AController");
          }
      }
}
于 2013-01-07T16:19:32.153 に答える