Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC如何防止it调用操作方法';s名称,但仅允许通过路由调用它_C#_Asp.net Mvc_Asp.net Mvc 4_Routing_.net 4.5 - Fatal编程技术网

C# MVC如何防止it调用操作方法';s名称,但仅允许通过路由调用它

C# MVC如何防止it调用操作方法';s名称,但仅允许通过路由调用它,c#,asp.net-mvc,asp.net-mvc-4,routing,.net-4.5,C#,Asp.net Mvc,Asp.net Mvc 4,Routing,.net 4.5,我正在使用.NET4.5和MVC4,并广泛使用路由 我在名为计算器的操作上有默认页面路由: context.MapRoute( "default", "Wills/{action}/{id}", new { controller = "Journey", action = "Calculator", id = UrlParameter.Optional } ); 要求是,当使用时,无法调用具有操作名称计算器(用作索引页面)的Url http://hostname.com

我正在使用
.NET4.5
MVC4
,并广泛使用路由

我在名为
计算器的操作上有默认页面路由:

context.MapRoute(
    "default",
    "Wills/{action}/{id}",
    new { controller = "Journey", action = "Calculator", id = UrlParameter.Optional }
);
要求是,当使用时,无法调用具有操作名称
计算器
(用作
索引
页面)的Url

http://hostname.com/controller/Calculator
并且只有在调用
http://hostname.com/controller


如何防止只允许通过路由调用actionMethod而不使用其名称调用它?

感谢@Stefan的建议,我使用了action属性,如果直接调用action,则抛出404-可能不是最优雅的解决方案,但可以满足我的需要

public class PreventDirectCallAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.RawUrl.Contains(filterContext.ActionDescriptor.ActionName))
        {
            throw new HttpException(404, "HTTP/1.1 404 Not Found");
        }

        base.OnActionExecuting(filterContext);
    }
}
用法如下:

[PreventDirectCall]
public ActionResult Calculator()
{
// your action code.
}

它是否需要在
http://hostname.com/controller/Calculator
?@Stefan是的,它看起来不存在是很理想的,但老实说,我会很乐意使用部分解决方案。嗯,我不知道有什么简单的方法可以做到这一点。您可以使用
ActionFilter
检查传入的URL字符串,如果符合您的条件,则返回404。在此路由中,您将默认使用
计算器
操作。你可能想考虑使用一个更通用的名称,这样你就可以做一个更通用的修复,也适用于其他控制器,但这可能需要大量的重构。欢迎其他建议。@Stefan谢谢Stefan我喜欢你的想法,属性解决方案已经完成。