Могут ли Asp.Net Mvc Route Constraints генерировать 404 вместо InvalidOperationException? - PullRequest
3 голосов
/ 24 ноября 2008

Я пытаюсь использовать ограничения маршрута в приложении MVC Asp.Net.

routes.MapRoute(
    "theRoute",
    "MyAction/{page}",
    new { controller = "TheController", action = "MyAction", page = 1 },
    new { page = @"[0-9]" });

Когда я ввожу URL-адрес, например ~ / MyAction / aString, отображается YSOD с недопустимым исключением операции. Что я могу сделать, чтобы перенаправить неверный URL на страницу 404?

Я знаю, что могу решить эту проблему с помощью строкового параметра в действии контроллера и int.TryParse, но тогда содержимое маршрута бесполезно.

Как мне выбрать тип исключения, выбрасываемый ограничениями маршрута?

Ответы [ 2 ]

3 голосов
/ 01 декабря 2008

Проблема в том, что у вас нет маршрута, который соответствует маршруту, оканчивающемуся на строку.

Измените маршруты, похожие на:

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, и вы можете делать все, что вам нужно, для обработки неправильного параметра.

0 голосов
/ 30 ноября 2011

Просто упомяну более общее перенаправление:

Вы можете написать в 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>
...