ASP.NET MVC - 带有URL附加参数的POST操作方法

时间:2010-03-17 20:05:42

标签: c# asp.net-mvc modelbinders actionmethod

使用ASP.net MVC是否可以将表单发布到控制器操作,该操作包括不在表单中的参数,但是来自URL?

例如

GroupController中的Action方法:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(int idOne, int idTwo, Model model)
    { ... }

路线:

"{controller}/{action}/{idOne}/{idTwo}"

发布网址:

/Employee/Show/1/42

在此示例中,表单将发布到其他控制器,模型具有正确的值,但其他参数的默认值为0.

我期望的行为是ModelBinder会看到我有两个与给定路径匹配的参数,并以与GET操作相同的方式将当前值1和42分配给参数。

这种行为不受支持,或者我遗漏了什么?

修改: 为了清楚起见,控制器Show的{​​{1}}视图上的表单包含一个发布到不同控制器的表单。我们可以称之为Employee

表单操作网址如下所示

Group

表格声明如下

/Groups/Create/0/0

Html.BeginForm("Create", "Groups") 尝试了许多不同的重载后,我发现仅当表单操作URL与浏览器地址栏中的当前URL匹配时才会映射参数。

因此,如果我导航到网址Html.BeginForm,我将会有一个新表单。如果我然后提交表单,则URL路由值将传递给POST操作。

5 个答案:

答案 0 :(得分:8)

如果我正确理解您的问题,您希望呈现的action元素的<form>指向包含路由值的网址。这应该可以使用HtmlHelper.BeginForm()扩展方法的一个重载:

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post);

如果我的问题完全错误,请告诉我。)

答案 1 :(得分:2)

我很确定您只能从表单内的输入中发布表单数据。您是否考虑过以这种方式呈现视图以从URL创建表单输入值(可能使用HTML帮助程序?)。

更新:如果您根本不想使用该表单,请使用ControllerContext.RouteData.Values["idOne"],而不是通过方法签名传递它。

答案 2 :(得分:0)

我最近也有这个问题,因为我有不同的路线,它是映射到默认路线,没有考虑我传入的额外路线参数。

为了让它快速运行,我使用表单标签编写了表单,并使用@ Url.Action创建了所需的操作。

答案 3 :(得分:0)

进入“创建”视图后,用于到达该位置的路线值需要重新发布到后期操作中。

所以,一个选择是拥有一对隐藏,以保持来自路线的ids。这样,一旦发布了formas,其值将与其他输入一起发布。

答案 4 :(得分:0)

我遇到了类似的问题,配置RouteConfig解决了这个问题。

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
             ...
             routes.MapRoute(
             "MyRoute",
             "{controller}/{action}/{idOne}/{idTwo}",
             new
             {
                 controller = "Employee", // as an example
                 action = "Show",
                 idOne = UrlParameter.Optional,
                 idTwo= UrlParameter.Optional
             }, new { idOne = @"\d{1,5}" });

        }
    }

...和...  Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post))
  

将开始标记写入响应。当用户提交时   在表单中,请求将由路由目标处理。   该成员超载。有关此成员的完整信息,   包括语法,用法和示例,单击重载中的名称   列表。

所有作品