Могут ли Asp.Net Mvc Route Constraints генерировать 404 вместо InvalidOperationException?
-
10-07-2019 - |
Вопрос
Я пытаюсь использовать ограничения маршрута в приложении Asp.Net MVC. Р>
routes.MapRoute(
"theRoute",
"MyAction/{page}",
new { controller = "TheController", action = "MyAction", page = 1 },
new { page = @"[0-9]" });
При вводе URL-адреса, например ~ / MyAction / aString, отображается YSOD с недопустимым исключением операции. Что я могу сделать, чтобы перенаправить неверный URL на страницу 404?
Я знаю, что могу решить проблему с помощью строкового параметра в действии контроллера и int.TryParse, но в этом случае содержимое маршрута бесполезно.
Как я могу выбрать тип исключения, который генерируется ограничениями маршрута?
Решение
Проблема в том, что у вас нет маршрута, который совпадает с маршрутом, заканчивающимся строкой.
Измените маршруты, похожие на:
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");
}
теперь, когда вы передаете строку для идентификатора, вызывается 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>
Тогда вам нужно иметь ActionResult
с именем MyCustomError
public class HomeController : Controller
{
...
...
public ActionResult MyCustomError(string aspxerrorpath)
/* the var aspxerrorpath
* is that MVC generated by
* default */
{
ViewData["messageError"] = aspxerrorpath;
return View();
}
}
Затем вы можете создать собственную страницу с ошибкой:
<%@ 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>