BeginForm 更改 "Name" 值

BeginForm changing the "Name" value

在我问我的问题之前,让我声明我确实在网上查看过,并且我确实查看过这个问题的堆栈溢出并且确实找到了某些解决方案,但是 none 我发现的对我有用。所以我在这里问希望能得到这个问题的答案,并感谢所提供的任何帮助。

我正在为外部网站制作一个表格 post。在我的模型中,我通过在我的 LoginViewModel 中执行以下操作创建了所有值:

public string returnurl { get; set; }

在我的构造函数中,我设置了所需的值,如下所示:

returnurl = "www.retururl.com";

在我的索引页面中,我使用 MVC 4.0 中的 Razor 进入 post:

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm", @action = Model.loginUrl }))
{
   @Html.HiddenFor(model => model.returnurl)
}

当我检查 fiddler 时,它会在幕后执行以下操作:

<input id="returnurl" name="returnurl" type="hidden" value="www.returnurl.com">

它使输入的 id 和 name 成为变量 returnurl 的名称。

我的问题是我的表单 post 中的名称值之一必须是 "bb-post"。我显然不能在我的 loginViewModel 中命名变量 bb-post 所以我尝试的只是将名称设置为类似 bb_post 然后在我的索引页面中。

所以我做了以下操作:

@Html.HiddenFor(model => model.bb_post, new { name = "bb-post" })

但这没有用,当我检查 fiddler 时它做了以下事情:

<input id="bb_post" name="bb_post" type="hidden" value="" />

我也试过这个:

@Html.HiddenFor(model => model.bb_post, new { @name = "bb-post" })

但得到了这个:

<input id="bb_post" name="bb_post" type="hidden" value="" />

最后试了一下:

@Html.HiddenFor(model => model.bb_post, new { @Name = "bb-post" })

但得到了这个:

<input Name="bb-post" id="bb_post" name="bb_post" Name="bb-post"  type="hidden" value="" />

像这样使用大写名称@Name 给了我两个名称值。这不是我要找的。

我意识到我可以直接将它写到 html:

<input id="bb_post" name="bb-post" type="hidden" value="" />

但为了保持所有外观相同,我希望有一种方法可以保持这种格式:

@Html.HiddenFor(model => model.bb_post, new { @Name = "bb-post" })

谢谢。

编辑: 我确实在推荐的问题中找到了答案,但接受的答案不正确。我肯定没有比错误接受的答案看得更远(我通常会这样做并道歉)。但是以下是如果其他人不小心跳过了这个问题的答案以接受错误的答案,因为它会生成两个名称值。 这是正确的答案,对我有用:

 @Html.Hidden("bb-post", Model.bb_post, new { id="bb-post" })

谢谢。

做错了什么

<input id="bb-post" name="bb-post" type="hidden" value="@model.bb_post" />

我刚刚尝试了以下方法:

@Html.HiddenFor(x => x.Client, new {id="bb-post", @Name = "bb-post"})

得到了这个结果 <input name="bb-post" id="bb-post" type="hidden" value="BDOObject.Client">

因此,如果您将 @Name 设置为大写 'N' 和 id,它会起作用。如果我不设置 id,它将采用原始值 bb_post 作为 id...但是大写字母 N 的@Name 似乎有效...

编辑: 所以显然它只是看起来有效,因为 Chrome 清理了 html。但是根据 this answer by nemesv,你最好使用 @Html.Hidden 而不是 @Html.Hiddenfor,像这样:

@Html.Hidden("bb-post", Model.bb_post, new { id="bb-post"})

因为 Html.Hiddenfor 试图从您的模型中推测名称 属性,这就是它与 Html.Hidden

的不同之处