使用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操作。
答案 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))
将开始标记写入响应。当用户提交时 在表单中,请求将由路由目标处理。 该成员超载。有关此成员的完整信息, 包括语法,用法和示例,单击重载中的名称 列表。
所有作品