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

Forms MVC.NET自定义根处理程序在Html:BeginForm中的错误操作,forms,asp.net-mvc-4,custom-routes,html.beginform,mvcroutehandler,Forms,Asp.net Mvc 4,Custom Routes,Html.beginform,Mvcroutehandler,我使用自定义mvc路由处理程序。但是,当我在视图中使用Html.BeginForm或Ajax.BeginForm时,操作参数会意外更改。我的密码在上面 我的注册路径方法是: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute("alias",

我使用自定义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”> 表单操作=“/man parfume”method=“post”>输入type=“submit”value=“send”/

我以begin形式将控制器编写为home,但在呈现Html.begin时它发生了变化

如何将表单发布到主页/索引?

您可以使用
而不是
Html.BeginForm

至于
Ajax.BeginForm
,可以在jQuery函数上更改:

   $.ajax({
      type: "POST",
      url: "@Url.RouteUrl("Default", new { controller="Home", action="Index"}",
      data: data,
      success: success,
      dataType: dataType
    });

谢谢,可以了,但你知道Html.BeginForm为什么不起作用吗?@sta你有两个类似操作的路径:默认值:new{controller=“Home”,Action=“Index”,id=UrlParameter.Optional}。在路线图中,“别名”排在第一位,因此Html.BeginForm将其作为其操作的路线。但在我看来,它无论如何都应该起作用。您的控制器操作可能有问题?它正在工作。但是,从post到自己的控制器。我的期望,它张贴到我希望的控制器和行动。有没有办法更改Html.BeginForm的路线图?我可以设置不同于所选的参数吗?