4

私が現在取り組んでいる MVC プロジェクトでは、ページなどをローカライズできるようにリージョンを使用しています。

エラー ページに問題があることがわかりました。web.config ファイルでカスタム エラー ページをオンにしました。/IT/News/Index というページにいる場合、エラーが発生します。リダイレクトすると、/Error に移動し、routevalue は関連付けられません。

エラーページで言語ルート値が保持されるようにする方法はありますか?

私は周りを検索しましたが、現時点では解決策を見つけることができません.

これがすべて理にかなっていることを願っています。どんな助けでも大歓迎です。

4

4 に答える 4

5

/Error に物理的にリダイレクトされている場合は、MVC の HandleErrorAttribute が原因ではありません。おそらく、エラー処理用に system.web/customErrors が定義されている Web.Config が原因です。HandleErrorAttribute を使用すると、通常返されるビューの代わりに特定のビューが挿入されますが、デフォルトでは別のアクションにリダイレクトされません。問題は、customErrors が原因でリダイレクトされた場合に、それらがどこから来たかを示す継承情報がないことです。しかし、HandleErrorAttribute DOES を使用すると、いくつかの情報が入力されます。具体的には、ビュー モデルとして使用する HandleErrorInfo を作成し、それを指定したビューに渡します。たとえば、/App_Start/FilterConfig.cs ファイルに登録されているものを次に示します。

public class FilterConfig
{
    public static void RegisterFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute {View = "Error"});
    }
}

HandleErrorAttribute を使用してエラー ビューにリダイレクトすると、特定の情報が入力されます。HandleErrorInfo ビュー モデルには、要求された元のコントローラーの ControllerName と元のアクションの ActionName が含まれます。また、元のリクエストの ViewData と TempData は、エラー ビューへのリクエストの ViewData と Temp データにコピーされます。その情報があれば、必要なものが含まれているはずです。ただし、すべてのエラーがアクション内で発生するわけではなく、アクション内で発生しない例外は、HandleErrorAttribute によってキャッチされないことに注意してください。そのため、アプリの他の場所で発生する例外を処理するには、引き続き customErrors (IIS7+ 内で実行している場合は system.webServer/httpErrors) などを使用する必要があります。

これが何をするのか疑問に思っている場合に備えて、CodePlex の HandleErrorAttribute ファイルへのリンクを次に示します。HandleErrorAttribute.cs

于 2013-04-05T13:59:34.887 に答える
2

このソリューションが要件を満たしているかどうかはわかりません。基本コントローラーの OnException でオーバーライドしてから、特定のページにリダイレクトできます。

  protected override void OnException(ExceptionContext filterContext)
  {
        string controller = filterContext.RouteData.Values["controller"].ToString();
        string action = filterContext.RouteData.Values["action"].ToString();
        //get other stuff from routing
        //here you can do redirect or other stuff

        //if handled exception
        //filterContext.ExceptionHandled = true;

        base.OnException(filterContext);
  }
于 2013-04-05T13:11:50.730 に答える
1

カスタムの HandleErrorAttribute を追加するか、基本コントローラーを使用してすべてのコントローラーに継承することができます。いずれにせよ、次のように RouteData オブジェクトを取得する必要があります

var routeData = filterContext.RouteData;

そのオブジェクトを使用すると、必要に応じてすべてのルート値を取得できます。詳細については、MSDN サイトのオブジェクト定義を確認してください

次のルートがあるとします

routes.MapRoute(
                "Language", // Route name
                "{language}/{controller}/{action}/{id}", // URL with parameters
                new { language = "en", controller = "Sites", action = "Index", id = UrlParameter.Optional } // Parameter default

次にrouteData.Values.Keys、パラメーターの名前とrouteData.Values.Values値自体が表示されます

次に、例外を処理する場所で、次のようにルート データを TempData 変数に格納できます。

TempData["RouteData"]

その後、エラーページで利用できるようになります

@model System.Web.Mvc.HandleErrorInfo

@{
    ViewBag.Title = "Error";
}

<h2>
    Sorry, an error occurred while processing your request.
</h2>
@TempData["RouteData"];
于 2013-04-11T15:52:38.480 に答える