c# - 如何在进行重定向之前确保 Controller 和操作存在,asp.net mvc3

标签 c# asp.net-mvc asp.net-mvc-3 reflection

在我的一个 Controller + Action 对中,我从某个地方获取另一个 Controller 和 Action 的值作为字符串,我想重定向我当前的 Action 。在进行重定向之前,我想确保 controller+action 存在于我的应用程序中,如果不存在则重定向到 404。我正在寻找一种方法来执行此操作。

public ActionResult MyTestAction()
{
    string controller = getFromSomewhere();
    string action = getFromSomewhereToo();

    /*
      At this point use reflection and make sure action and controller exists
      else redirect to error 404
    */ 

    return RedirectToRoute(new { action = action, controller = controller });
}

我所做的就是这个,但它不起作用。

var cont = Assembly.GetExecutingAssembly().GetType(controller);
if (cont != null && cont.GetMethod(action) != null)
{ 
    // controller and action pair is valid
}
else
{ 
    // controller and action pair is invalid
}

最佳答案

您可以实现 IRouteConstraint 并在您的路由表中使用它。

此路由约束的实现可以使用反射来检查 Controller /操作是否存在。如果它不存在,则该路线将被跳过。作为路由表中的最后一条路由,您可以设置一个捕获所有路由并将其映射到呈现 404 View 的操作。

这里有一些代码片段可以帮助您入门:

public class MyRouteConstraint : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {

            var action = values["action"] as string;
            var controller = values["controller"] as string;

            var controllerFullName = string.Format("MvcApplication1.Controllers.{0}Controller", controller);

            var cont = Assembly.GetExecutingAssembly().GetType(controllerFullName);

            return cont != null && cont.GetMethod(action) != null;
        }
    }

请注意,您需要使用 Controller 的完全限定名称。

路由配置.cs

routes.MapRoute(
                "Home", // Route name
                "{controller}/{action}", // URL with parameters
                new { controller = "Home", action = "Index" }, // Parameter defaults
                new { action = new MyRouteConstraint() } //Route constraints
            );

routes.MapRoute(
                "PageNotFound", // Route name
                "{*catchall}", // URL with parameters
                new { controller = "Home", action = "PageNotFound" } // Parameter defaults
            );

关于c# - 如何在进行重定向之前确保 Controller 和操作存在,asp.net mvc3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7033428/

相关文章:

c# - 通过 LINQ 创建匿名对象

c# - 在C#类项目中,AssemblyCulture是干什么用的?

c# - 可选属性中的 MVC 必需属性

c# - MVC C# - 带条件的数据行中的数据表

jquery - koGrid 清空我们的网格,而不是使用 Asp.Net MVC 3 使用 KnockoutJS 进行更新

c# - Json空数组在MVC中反序列化为null

c# - Winforms、WebControl、谷歌地图和无效渲染

c# - 另一个使用 StreamWriter 的进程正在使用的文件

javascript - 使单选按钮在加载表单时不被选中?

jquery - 使用 jQuery 日期选择器从 ASP MVC @Html.TextBoxFor 控件中删除时间