gpt4 book ai didi

asp.net-mvc - 向 Html.BeginForm() 添加 HTML 属性的变化

转载 作者:行者123 更新时间:2023-12-04 07:01:37 25 4
gpt4 key购买 nike

我的 ASP.NET MVC Razor 页面上需要一个表单。我的偏好是使用以下语法:

@using (Html.BeginForm())
{
}

但是,我需要在表单中添加几个属性。所以我最终得到了如下内容:
@using (Html.BeginForm(null, null, FormMethod.Post, new { name = "value" }))
{
}

然而,这有不希望的副作用。如果此页面的请求中有查询参数,则在提交表单时第一个表单将传递它们。但是,第二个版本没有。

真不知道为什么 BeginForm()不支持属性,但是否有一种直接的方法可以将属性添加到 BeginForm()并且在提交 for 时仍然传递任何查询参数?

编辑:

在研究了这一点之后,似乎最好的解决方案是这样的:
<form action="@Request.RawUrl" method="post" name="value">
</form>

但是,使用此语法时,禁用客户端验证。如果没有更复杂且可能不可靠的结构,似乎没有好的解决方案可以解决这种情况。

最佳答案

确实如此,但我会使用自定义帮助程序以保留其中用于客户端验证的表单上下文:

public static class FormExtensions
{
private static object _lastFormNumKey = new object();

public static IDisposable BeginForm(this HtmlHelper htmlHelper, object htmlAttributes)
{
string rawUrl = htmlHelper.ViewContext.HttpContext.Request.RawUrl;
return htmlHelper.FormHelper(rawUrl, FormMethod.Post, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}

private static int IncrementFormCount(IDictionary items)
{
object obj2 = items[_lastFormNumKey];
int num = (obj2 != null) ? (((int)obj2) + 1) : 0;
items[_lastFormNumKey] = num;
return num;
}

private static string DefaultFormIdGenerator(this HtmlHelper htmlhelper)
{
int num = IncrementFormCount(htmlhelper.ViewContext.HttpContext.Items);
return string.Format(CultureInfo.InvariantCulture, "form{0}", new object[] { num });
}

private static IDisposable FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes)
{
var builder = new TagBuilder("form");
builder.MergeAttributes<string, object>(htmlAttributes);
builder.MergeAttribute("action", formAction);
builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
bool flag = htmlHelper.ViewContext.ClientValidationEnabled && !htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled;
if (flag)
{
builder.GenerateId(htmlHelper.DefaultFormIdGenerator());
}
htmlHelper.ViewContext.Writer.Write(builder.ToString(TagRenderMode.StartTag));
var form = new MvcForm(htmlHelper.ViewContext);
if (flag)
{
htmlHelper.ViewContext.FormContext.FormId = builder.Attributes["id"];
}
return form;
}
}

可以这样使用:
@using (Html.BeginForm(htmlAttributes: new { name = "value" }))
{
...
}

关于asp.net-mvc - 向 Html.BeginForm() 添加 HTML 属性的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9511323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com