MVC.NET自定义根处理程序Html中的错误操作:BeginForm

时间:2013-08-15 09:24:10

标签: forms asp.net-mvc-4 custom-routes html.beginform mvcroutehandler

我使用了自定义mvc路由处理程序。但是当我在视图中使用Html.BeginForm或Ajax.BeginForm时,Action参数会意外更改。我的代码在上面

我的注册路线方法是:

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”>输入类型=“提交”值=“发送”/>

我在开始形式中将控制器编写为主页,但在Html.BeginForm呈现时它已更改。

如何将表单发布到Home / Index?

1 个答案:

答案 0 :(得分:0)

您可以使用<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
    });