Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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
Asp.net mvc Asp.NETMVC路由约束是否可以引发404而不是InvalidOperationException?_Asp.net Mvc_Routing_Asp.net Mvc Routing_Http Status Code 404 - Fatal编程技术网

Asp.net mvc Asp.NETMVC路由约束是否可以引发404而不是InvalidOperationException?

Asp.net mvc Asp.NETMVC路由约束是否可以引发404而不是InvalidOperationException?,asp.net-mvc,routing,asp.net-mvc-routing,http-status-code-404,Asp.net Mvc,Routing,Asp.net Mvc Routing,Http Status Code 404,我试图在Asp.NETMVC应用程序中使用路由约束 routes.MapRoute( "theRoute", "MyAction/{page}", new { controller = "TheController", action = "MyAction", page = 1 }, new { page = @"[0-9]" }); 当我输入像~/MyAction/aString这样的url时,会显示一个YSOD,其中包含一个无效的操作异常。如何将无效url重

我试图在Asp.NETMVC应用程序中使用路由约束

routes.MapRoute(
    "theRoute",
    "MyAction/{page}",
    new { controller = "TheController", action = "MyAction", page = 1 },
    new { page = @"[0-9]" });
当我输入像~/MyAction/aString这样的url时,会显示一个YSOD,其中包含一个无效的操作异常。如何将无效url重定向到404页面

我知道我可以在控制器操作和int.TryParse中使用一个字符串参数来解决这个问题,但是路由约束是无用的


如何选择路由约束引发的exceptiontype?

问题是您没有与以字符串结尾的路由匹配的路由

修改路线,类似于:

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = 0 },
    new { id = "[0-9]" }// Parameter defaults
);
routes.MapRoute(
    "Default2",                                              // Route name
    "{controller}/{action2}/{sid}",                           // URL with parameters
    new { controller = "Home", action = "Index2", sid = "" }  // Parameter defaults
);
并修改控制器

public ActionResult Index(int id)
    {
        ViewData["Title"] = "Home Page";
        ViewData["Message"] = "Welcome to ASP.NET MVC! Your id is: "+ id.ToString();

        return View();
    }

    public ActionResult Index2(string sid)
    {
        ViewData["Title"] = "Home Page 2."+sid.ToString();
        ViewData["Message"] = "Welcome to ASP.NET MVC! \"" + sid.ToString() +"\" is an invalid id";

        return View("index");
    }

现在,当您为ID传递一个字符串时,将调用Index2,您可以执行任何需要执行的操作来处理错误的参数。

仅提及一个更通用的重定向:

您可以在应用程序的Web.config中编写:

<system.web>
    ...
    ...
    <customErrors mode="On">
        <error 
            statusCode="404" 
            redirect="/Home/MyCustomError" /> 
                                <!--    Is not necessary that the 
                                        view MyCustomError.aspx are inside the 
                                        Home folder, you can put that 
                                        view in the Shared folder.
                                -->
    </customErrors>
    ...
    ...
</system.web>
然后,您可以创建自定义错误页:

<%@ Page Language="C#" 
        MasterPageFile="~/Views/Shared/Site.Master" 
        Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>

<asp:Content ID="errorTitle" ContentPlaceHolderID="TitleContent" runat="server">
    Error
</asp:Content>

<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Shit happends</h2>
     <p> <%: ViewData["messageError"]%></p>
     <p>aaaaaaaaaaaaaaa!!!!!!!!!!!!!!!!!!!!</p>
</asp:Content>

错误
大便发生了

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

<%@ Page Language="C#" 
        MasterPageFile="~/Views/Shared/Site.Master" 
        Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>

<asp:Content ID="errorTitle" ContentPlaceHolderID="TitleContent" runat="server">
    Error
</asp:Content>

<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Shit happends</h2>
     <p> <%: ViewData["messageError"]%></p>
     <p>aaaaaaaaaaaaaaa!!!!!!!!!!!!!!!!!!!!</p>
</asp:Content>