将 Html.BeginForm 与查询字符串一起使用
Posted
技术标签:
【中文标题】将 Html.BeginForm 与查询字符串一起使用【英文标题】:Using Html.BeginForm with querystring 【发布时间】:2011-09-06 16:59:16 【问题描述】:我的网址如下所示:
customer/login?ReturnUrl=home
在登录视图中,我使用了这种运行良好的代码模式。
@using(html.BeginForm())
...
这会神奇地生成以下html
<form action="customer/login?ReturnUrl=home" method="post">
但是现在,我需要在表单中添加一个属性(例如,data-id="something"
)。我怎样才能做到这一点?如果我没有任何查询字符串,我知道我可以这样做:
@using(Html.BeginForm(action, controller, FormMethod.Post,
new data_id="something" ))
但不知道如何添加应该在 html 中的查询字符串:
<form action="customer/login?ReturnUrl=home" method="post" data-id="something">
我考虑过直接使用<form>
,但不知道如何指定可变的查询字符串。而且我不知道如何使用Html.BeginForm
来实现它。任何提示将不胜感激。
解决方案:
目前,我使用<form>
并带有以下提示How to get current url value in View。结果视图看起来像
<form action="@Request.Url.PathAndQuery" data-id="something" method="POST">
但如果有一个 BeginForm
的重载方法会很好。
【问题讨论】:
你想在哪里添加属性,表单或表单中的东西? 您是要添加另一个表单值还是要动态设置查询字符串? @msarchet 和 Tejs 我想要表单元素的属性。 [This][1] 肯定会帮助解决 BeginForm [1]:***.com/questions/3076656/… 【参考方案1】:这是对我有用的方法
Html.BeginForm("Profile", "Partner", routeValues: new id=Partner.partner_id,method:FormMethod.Post)
这几乎就像重载方法存在问题,但通过指定事物是什么,它似乎工作正常......
【讨论】:
在 routeValues 字典中添加查询字符串参数对我有用。 如果我也想在表单中添加类,@using (Html.BeginForm("actionName", "controllerName", routeValues: new lang = "en" , method:FormMethod .Post, htmlAttributes: new @class="my-form", enctype="multipart/form-data" ))【参考方案2】:从查询字符串创建 RouteValueDictionary:
RouteValueDictionary queryStringDictionary = new RouteValueDictionary(Request.QueryString.AllKeys.ToDictionary(key => key, key => (object)Request.QueryString[key]));
然后你可以将它与 Html.BeginForm 一起使用:
Html.BeginForm(null, null, queryStringDictionary, FormMethod.Post, new Dictionary<string, object> "autocomplete", "off" )
【讨论】:
【参考方案3】:我想这并不能直接回答这个问题,但为什么不直接使用一个普通的旧表单标签呢?
<form action='customer/login?ReturnUrl=@Request.QueryString["ReturnUrl"]' method="post" data-id="something">
或者,您可以创建一个自定义 HtmlHelperExtension 来呈现带有路径和查询字符串的表单。在这个 HtmlHelperExtension 中,您可以遍历查询字符串值并填充 routeValueDictionary,然后将其传递给 Html.BeginForm 构造函数。
如果你不想要如此可扩展的东西,你可以使用 Html.BeginForm 的重载构造函数
@Html.BeginForm("login", "customer", new ReturnUrl = @Request.QueryString["ReturnUrl"],FormMethod.Post, new data-id="something");
【讨论】:
我刚刚注意到你也用第一个想法编辑了你的问题。 但是如果我添加另一个查询字符串,我必须再次更改代码。我得到了更好的答案,请参阅我更新答案的最后一部分。谢谢你的回答。 不客气。我也使用 BeginForm 本身的构造函数更新了我的答案。【参考方案4】:使用Reflector看代码,
BeginForm() 将直接将 rawUrl 传递给最终表单。 BeginForm 上的任何其他重载都将通过一个辅助实用程序来去除查询字符串。
【讨论】:
【参考方案5】:这对我有用:
@using (Html.BeginForm("index", "Photos", routeValues: new user = pUser, album = pAlbum, , method: FormMethod.Get))
需要显式的路由值和方法...
【讨论】:
【参考方案6】:以防您还想添加其他属性。使用下面的代码
@using (Html.BeginForm("actionName", "controllerName", routeValues: new lang = "en" , method:FormMethod.Post, htmlAttributes: new @class= "my-form", enctype = "multipart/form-data" ))
【讨论】:
【参考方案7】:试试@using(Html.BeginForm(null, null, FormMethod.Post, new data_id="something" ))
它应该使用默认逻辑来构造url,就像你使用BeginForm()
一样
(虽然在这种情况下从未尝试过,但我相信它应该可以工作)
【讨论】:
我已经尝试过了,但生成的表单有action="/customer/login"
。应该是/customer/login?ReturnUrl=home
很遗憾,在将 null 传递给操作和控制器参数时,它不会保留查询字符串。以上是关于将 Html.BeginForm 与查询字符串一起使用的主要内容,如果未能解决你的问题,请参考以下文章
使用 javascript 将路由值传递给 Html.BeginForm
MVC小系列Html.BeginForm与Ajax.BeginForm
如何通过 jquery ajax 与 FormData 一起发送 AntiForgeryToken (CSRF)
Html.BeginForm (ASP.NET MVC) 的问题