如何处理MVC上丢失的文件

时间:2010-03-21 09:53:38

标签: c# .net asp.net-mvc

处理MVC应用程序中不存在的文件的匹配的首选方法是什么。

我有几个使用MVC运行的网络应用程序,并且他们不断获得应用程序结构中不存在的文件夹等的点击。

应用程序抛出异常:无法找到路径控制器或者它没有实现IController

我正试图找出解决这个问题的最佳方法。

我的global.asax文件中有3个全局路由(见下文),此时我很满意这个简单的定义。我知道如果我为所有控制器添加了路由定义,那么我可以添加一个定义来忽略其余的并处理这些命中但如果没有它可以解决这个问题,我不想为每个控制器添加路由定义相信会淹没路线定义,还会添加一层我不喜欢的维护。

//Aggregates 2nd level
            routes.MapRoute(
                "AggregateLevel2",
                "{controller}/{action}/{id}/{childid}/{childidlevel2}",
                new { controller = "Home", action = "Index", id = "", childid = "", childidlevel2 = "" }
            );

            //Aggregates 1st level
            routes.MapRoute(
                "AggregateLevel1",
                "{controller}/{action}/{id}/{childid}",
                new { controller = "Home", action = "Index", id = "", childid = "" }
            );

            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = "" }
            );

2 个答案:

答案 0 :(得分:0)

一般来说,这是一个有效的错误,你真正想要的是不会得到一个黄色的死亡屏幕。

好消息是,这很容易。在你的web.config中有一个名为customErrors的标签,它可能(除非你改变它)将其模式设置为remoteOnly。如果是这种情况,那么当请求不是来自localhost 时,ASP.net自定义错误处理程序已经处理失败的请求,例如。如果您想在本地运行的开发箱上看到该行为,请将模式更改为“开启”。

开箱即用的行为是在应用了HandleError属性的控制器上处理错误。这非常有效,并且您可以通过将argumetns传递给该属性来以不同方式处理不同的错误。通常,该属性只会将错误信息输出到Error.aspx视图(默认情况下位于您的共享文件夹中),该视图只会显示一个错误的平面声明。

您正在寻找的行为可能需要您更改所有这些行为,在这种情况下,您可以创建自己的属性,该属性继承自IExceptionFilter并在其中执行您想要的操作。

此外,总是可以选择在global.asax或模块中覆盖应用程序的OnError,就像普通的ASP.Net一样。

答案 1 :(得分:0)

这可能完全是错误的方法,但在我的私人网站上,我在global.asax文件中有这个;

    protected void Application_Error(object sender, EventArgs e)
    {
        HttpException httpException = Server.GetLastError() as HttpException;
        RouteData routeData = new RouteData();

        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("action", "Index");
        routeData.Values.Add("statusCode", httpException.GetHttpCode().ToString());

        Server.ClearError();

        IController errorController = new MyDomain.Controllers.ErrorController();

        errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    }

然后我有一个错误控制器;

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        //log out the error
        //string statusCode = RouteData.Values["statusCode"].ToString();

        return RedirectToAction("Index", "Home");
    }

}

因此,当出现错误时,我总是将用户带回我的索引页面。

这只是一个私人网站,所以我可以采取很多自由,我的观点是你显示黄色屏幕的次数越少,你给潜在黑客的信息越少越好。