Пользовательский корневой обработчик MVC.NET Неправильное действие в Html: BeginForm

Я использовал собственный обработчик маршрута mvc. Но когда я использую в представлении Html.BeginForm или Ajax.BeginForm, параметры действия неожиданно меняются. Мои коды выше

Мой метод регистрации маршрута:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute("alias",
                        "{alias}",
                        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
                        ).RouteHandler = new FriendlyUrlRoutehandler();


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

Мой MvcRouteHandler:

public class FriendlyUrlRoutehandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var friendlyUrl = (string)requestContext.RouteData.Values["alias"];

        if (friendlyUrl != null)
        {
            if (friendlyUrl.Equals("man-parfume"))
            {
                requestContext.RouteData.Values["controller"] = "ManParfume";
                requestContext.RouteData.Values["action"] = "Index";
            }
            else if (friendlyUrl.Equals("ring"))
            {
                requestContext.RouteData.Values["controller"] = "Ring";
                requestContext.RouteData.Values["action"] = "Index";
            }
            else if (friendlyUrl.Equals("glases"))
            {
                requestContext.RouteData.Values["controller"] = "Categories";
                requestContext.RouteData.Values["action"] = "Index";
                requestContext.RouteData.Values["id"] = 10;
            }
        }

        return base.GetHttpHandler(requestContext);
    }
}

Мое мнение:

@using (Ajax.BeginForm("Index", "Home", new AjaxOptions { HttpMethod = "Post" }))
@using (Html.BeginForm("Index", "Home"))

Наконец, неправильное действие в браузере выглядит так:

form action = "/ man-parfume" data-ajax = "true" data-ajax-method = "Post" id = "form0" method = "post"> form action = "/ man-parfume" method = "post" > input type = "submit" value = "send" />

Я написал контроллер как домашний в начальной форме, но он изменился при рендеринге Html.BeginForm.

Как я могу разместить форму в Home / Index?


person natrenakres    schedule 15.08.2013    source источник


Ответы (1)


Вы можете использовать <form action="@Url.RouteUrl("Default", new { controller="Home", action="Index"}" method="post"> вместо Html.BeginForm.

Что касается Ajax.BeginForm, его можно изменить в функции jQuery:

   $.ajax({
      type: "POST",
      url: "@Url.RouteUrl("Default", new { controller="Home", action="Index"}",
      data: data,
      success: success,
      dataType: dataType
    });
person Andrey Gubal    schedule 15.08.2013
comment
Спасибо, хорошо, это работа, но знаете ли вы, почему Html.BeginForm не работает? - person natrenakres; 15.08.2013
comment
@sta у вас есть два пути к аналогичному действию: defaults: new {controller = Home, action = Index, id = UrlParameter.Optional}. Псевдоним стоит первым в вашей карте маршрутов, поэтому Html.BeginForm принимает его как маршрут для своего действия. Но, на мой взгляд, все равно должно работать. Может что-то не так с вашим контроллером? - person Andrey Gubal; 15.08.2013
comment
это работает. Однако отправьте сообщение своему контроллеру. Я ожидаю, что он отправит сообщение моему желаемому контроллеру и действию. есть ли способ изменить карту маршрута Html.BeginForm? Могу ли я установить отличное от выбранного BeginForm? - person natrenakres; 15.08.2013