使用Execute调用控制器操作后,MVC3 Url.Action()无法正常工作

时间:2012-03-09 12:44:48

标签: asp.net-mvc asp.net-mvc-3

我在MVC3应用程序的某个页面上。浏览器中的网址为http://localhost:60901/MyApp/Ideas/Create/。现在我在发布一些数据后在这个页面上得到一个例外。我有错误处理。简化版如下所示。

Global.asax中

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    RouteData routeData = new RouteData();
    routeData.Values.Add("action", "General");            
    routeData.Values.Add("e", exception);

    using (ErrorController errorController = new ErrorController())
    {
        ((IController)errorController).Execute(new RequestContext(new HttpContextWrapper(HttpContext.Current), routeData));
    }
}

ErrorController.cs

public class ErrorController : Controller
{        
    public ActionResult General(Exception e)
    {
        ViewBag["ReturnToUrl"] = Url.Action("Index", "Ideas");
        return View();
    }
}

ViewBag中的ReturnToUrl令人惊讶的是 // Ideas / Index / MyApp 前缀是什么?通常,Url.Action(“Index”,“Ideas”)返回 / MyApp / Ideas / Index / 。控制器上下文有问题吗?如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

为什么不手动设置ViewBag [“ReturnToUrl”] =“/ MyApp / Ideas / Index /”。

答案 1 :(得分:1)

Jarek,

“MyApp”是您申请的一个区域吗?如果是这样,您可以将区域指定为路径值的一部分,如下所示:

Url.Action("Action", "Controller", new { Area = "MyApp" });

如果“MyApp”不是某个区域,您可以稍微解释一下您的配置。

希望这有帮助,

-covo

答案 2 :(得分:0)

我发现了问题。这是我的错。我错过了这个案例,我正在使用的系统中的所有路由都定义如下:

routes.MapRoute(
     "Default", // Route name
     "{application}/{controller}/{action}/{*id}", // URL with parameters
     new { controller = "Welcome", action = "Index", id = UrlParameter.Optional, application = UrlParameter.Optional } // Parameter defaults
            );

他们在开头({controller}参数之前)有一个{application}参数。

以前,我没有将此参数传递给ErrorController。通过后

routeData.Values.Add("application", "MyApp");

程序按预期工作。