【问题标题】:How to redirect user to action method of specific controller asp.net mvc如何将用户重定向到特定控制器 asp.net mvc 的操作方法
【发布时间】:2015-02-17 07:36:32
【问题描述】:

我正在阅读一篇关于 mvc 的文章,了解不受控制的行为 http://www.codeproject.com/Articles/874284/ASP-NET-MVC-Performance-Tips?msg=5003414#xx5003414xx

他们为不受控制的行为编写此代码

protected override void HandleUnknownAction(string actionName)
{
       RedirectToAction("Index").ExecuteResult(this.ControllerContext);
}

作者是说如果用户请求http://localhost:58234/default/index1, index1 action which does not exist so it will redirect to the default/index

我想开发一个基本控制器,并为请求 url 放置一个检测动作方法或控制器是否存在的例程。如果不存在,则它将用户重定向到具有查询字符串值的特定控制器的操作方法。因此,我们可以向用户显示友好的消息。

我仍然没有机会在办公室使用 mvc。只是出于好奇,我想知道如何使用base controller 实现该功能?

帮助我提供示例代码。谢谢

【问题讨论】:

标签: asp.net-mvc


【解决方案1】:

你可以像下面这样简单地创建基类

 public class BaseController : Controller
    {
        protected override void HandleUnknownAction(string actionName)
        {
            //Your code
            RedirectToAction("Index").ExecuteResult(this.ControllerContext);
        }
    }

你的所有控制器都应该继承BaseController而不是Controller

用例

YOURDOMAIN.COM\CorrectController\InCorrectActionMethod // `HandleUnknownAction` will be called

YOURDOMAIN.COM\InCorrectController\InCorrectActionMethod // `HandleUnknownAction` will be not be called, in this case 404 will be thrown.

【讨论】:

  • HandleUnknownAction 是如何被调用的?
  • 因此,每当发现无效的操作方法时,就会调用这个 HandleUnknownAction ,如果控制器名称本身不正确,那么它不会被调用。
  • 谁告诉 MVC 处理程序调用此方法而不是 HandleUnknownAction123()?
  • 方法名它自己描述了它的职责,检查这个链接msdn.microsoft.com/en-us/library/…这个方法会在请求匹配这个控制器时调用,但是在控制器中没有找到具有指定动作名称的方法。
  • 你说得对,我不知道Controller类中有这个方法。 +1
【解决方案2】:

为什么你需要这样做。 就这样吧。 管理Application_Error事件表单Global.asax文件。

protected void Application_Error(Object sender, EventArgs e)
    {

        //process 404 HTTP errors
        var httpException = exception as HttpException;
        if (httpException != null && httpException.GetHttpCode() == 404)
        {
                Response.Clear();
                Server.ClearError();
                Response.TrySkipIisCustomErrors = true;

                // Call target Controller and pass the routeData.
                IController errorController = "Your Controller";

                var routeData = new RouteData();
                routeData.Values.Add("controller", "Common");
                routeData.Values.Add("action", "PageNotFound");

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

        }
    }

希望对您有所帮助。

【讨论】:

  • 这一行给出错误EngineContext.Current.Resolve<IWebHelper> 未编译。我需要包含任何程序集吗?
  • 当用户提供不正确的控制器或动作名称时,您的解决方案是否处理?
  • IWebHelper 用作应用程序全局接口来获取常见的错误控制器。
  • 你能不能给出完整的代码,所以我可以理解 IWebHelper 的用法。
  • 我正在处理多累应用程序。EngineContext.Corrent 返回一个Singletone 实例。Resolve 使用D I .IWebHelper 类包含ErrorController 等属性...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2013-02-13
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多