使用HtmlHelper.BeginForm匹配复杂的路由

时间:2013-01-24 06:05:23

标签: asp.net-mvc forms asp.net-mvc-4 html-helper

我有一个复杂的路线,我想与HtmlHelper.BeginForm方法匹配。我已经阅读了很多关于使用路由值字典和对象初始化器和html属性的文章和答案。但他们都没有达到我想要的目的......

以下是我想要匹配的路线:

// Attempt to consolidate all Profile controller actions into one route
routes.MapRoute(
    "Profile",
    "{adminUserCode}/{controller}s/{customerId}/{action}/{profileId}",
    new { adminUserCode = UrlParameter.Optional, controller = "Profile"},
    new { adminUserCode = @"\d+", customerId = @"\d+", profileId = @"\d+" }
);

控制器的示例网址&我希望与之匹配的行动是:

http://mysite.com/123/Profiles/456/UpdatePhoneNumber/789

实际电话号码在POST正文中

这是我最接近正确的语法:

@using (Html.BeginForm(
    "UpdatePhoneNumber",
    "Profile",
    new {
        customerId = Model.LeadProfile.CustomerId,
        profileId = Model.CustomerLeadProfileId
    }))
{
    <!-- the form -->
}

但是这会将参数作为查询字符串参数放在对象中,如下所示:

<form method="post"
    action="/mvc/123/Profiles/UpdatePhoneNumber?customerId=78293&profileId=1604750">

我只是随心所欲地尝试了这种语法,但它输出与其他重载相同的东西

@using (Html.BeginForm(new
{
    controller = "Profile",
    customerId = Model.LeadProfile.CustomerId,
    action = "UpdatePhoneNumber",
    profileId = Model.CustomerLeadProfileId
}))

我知道我可以在这里使用原始HTML,但似乎应该有办法让愚蠢的HtmlHelper匹配超过最基本的路径。

1 个答案:

答案 0 :(得分:1)

如果您想在表单中使用复杂的路线,则需要使用BeginRouteForm Method

@using (Html.BeginRouteForm("Profile", new
{
    controller = "Profile",
    customerId = Model.LeadProfile.CustomerId,
    action = "UpdatePhoneNumber",
    profileId = Model.CustomerLeadProfileId
}))