1

前に質問しましたが、コードはありません。シナリオは次のとおりです。global.asax、ErrorController.cs、および Error.cshtml を含む基本的な mvc アプリがあります。私が達成したいのは、これを他の mvc アプリのすべてのエラー処理の中心点にすることです。しかし、壁にぶつかったようですので、フィードバック/ヘルプをいただければ幸いです。このハンドラー アプリケーションは別の mvc アプリから呼び出され、コードの最後の行 (IController).Execute() を呼び出すと、「ビューが見つかりません」が発生します。私が考えていることは、呼び出しが呼び出し先アプリに返され、その名前のビューがないため、エラーが発生することです。したがって、私が望むのは、ハンドラー アプリが独自のエラー ビューを使用することです。それが可能かどうかはわかりませんか?これがglobal.asaxのコードです

protected virtual void OnApplicationError(object sender, EventArgs e)
{
    var httpApplicationContext = ((HttpApplication) sender).Context;
    var currentController = string.Empty;
    var currentAction = string.Empty;
    var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpApplicationContext));

    if (currentRouteData != null)
    {
        if (currentRouteData.Values["controller"] != null && !string.IsNullOrEmpty(Convert.ToString(currentRouteData.Values["controller"])))
        {
            currentController = Convert.ToString(currentRouteData.Values["controller"]);
        }
        if (currentRouteData.Values["action"] != null && !string.IsNullOrEmpty(Convert.ToString(currentRouteData.Values["action"])))
        {
            currentAction = Convert.ToString(currentRouteData.Values["action"]);
        }
    }

    var ex = Server.GetLastError();
    var routeData = new RouteData();
    var action = "Error";
    var errorController = new ErrorController();

    httpApplicationContext.ClearError();
    httpApplicationContext.Response.Clear();
    httpApplicationContext.Response.StatusCode = ex is HttpException ? ( (HttpException)ex ).GetHttpCode() : 500;
    httpApplicationContext.Response.TrySkipIisCustomErrors = true;

    if (httpApplicationContext.Request.Headers["X-Requested-With"] != "XMLHttpRequest")
    {
        routeData.Values["controller"] = "Error";
        routeData.Values["action"] = action;
        errorController.ViewData.Model = new HandleErrorInfo(ex, currentController, currentAction);
        ((IController)errorController).Execute(new RequestContext(new HttpContextWrapper(httpApplicationContext), routeData));
    }
}
4

1 に答える 1

0

右: たくさんのグーグルと読書の後、私はこの仕事をすることができました: 基本的に別のクラス ライブラリを作成し、このリンクに基づいて VirtualPathProvider から継承する新しいクラスを追加しましたhttp://www.danielroot.info/2013/07/reuse-mvc- views-using-virtual-path.html。次に、MVC アプリからこのライブラリへの参照を追加しました。すべて正常に動作しているようです。

于 2013-11-13T16:54:52.110 に答える