11

使用 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,控制器视图上Employee的表单包含一个发布到不同控制器的表单。我们可以称之为Group

表单操作 URL 如下所示

/Groups/Create/0/0

表格声明如下

Html.BeginForm("Create", "Groups")

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

因此,如果我导航到 URL /Groups/Create/1/42,我将有一个新表单。如果我随后提交表单,则 URL 路由值将传递给 POST 操作。

4

5 回答 5

10

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

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

让我知道我是否把你的问题都弄错了:)

于 2010-03-17T20:14:07.787 回答
2

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

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

于 2010-03-18T14:14:12.210 回答
1

我也遇到过类似的问题,配置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))

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

所有作品

于 2013-11-19T17:57:58.367 回答
0

进入 Create 视图后,用于到达那里的路线值需要重新发布到 post 操作。

因此,一个选项是有一对隐藏,以保存来自路线的 id。这样,一旦您发布了表单,它的值就会与其他输入一起发布。

于 2013-11-19T16:32:43.243 回答
0

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

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

于 2013-11-19T15:24:35.867 回答