【问题标题】:BeginForm changing the "Name" valueBeginForm 更改“名称”值
【发布时间】:2015-09-16 14:35:15
【问题描述】:

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

我正在向外部网站发布表单。在我的模型中,我通过在 LoginViewModel 中执行以下操作来创建所有值:

public string returnurl { get; set; }

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

returnurl = "www.retururl.com";

在我的索引页面中,我使用 MVC 4.0 中的 Razor 来发帖:

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

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

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

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

我的问题是我的表单帖子中的名称值之一必须是“bb-post”。我显然无法在我的 loginViewModel 中命名变量 bb-post,所以我尝试的只是将名称设置为 bb_post 之类的名称,然后在我的索引页面中。

所以我做了以下事情:

@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 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" })

谢谢。

【问题讨论】:

  • 设置名称时不需要@ .. 只需使用new { Name = "bb-post" })
  • 问题中接受的答案实际上是错误的,我在尝试但不工作后不小心跳过了它。虽然@James 下面的答案确实有效,但我编辑了我的问题以提供该信息。

标签: html asp.net-mvc asp.net-mvc-4 razor html.beginform


【解决方案1】:

做错了什么

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

【讨论】:

  • 好吧,我正在写一篇包含大约 20 个输入的大型帖子,并且我正在使用以下格式:@Html.HiddenFor(model => model.appName) @Html.HiddenFor (model => model.texans) @Html.HiddenFor(model => model.rockets) @Html.HiddenFor(model => model.astros) @Html.HiddenFor(model => model.returnurl) @Html.HiddenFor(model => model.texans2) @Html.HiddenFor(model => model.astros2) @Html.HiddenFor(model => model.rockets2) 我想保持不变有什么问题吗?
  • 我实际上在我的帖子中说过我希望它保持不变。如果不可能,那么我会这样做。
  • @AndreiM 是的,它是一个有效的解决方案。它可能不是 OP 想要的解决方案,但它仍然是一个解决方案。
【解决方案2】:

我刚刚尝试了以下方法:

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

得到了这个结果 &lt;input name="bb-post" id="bb-post" type="hidden" value="BDOObject.Client"&gt;

因此,如果您将@Name 设置为大写“N”和 id,则它可以工作。如果我不设置 id,它会采用原始​​值 bb_post 作为 id...但是 @Name 与大写 N 似乎上班……

编辑: 显然它似乎只工作,因为 Chrome 清理了 html。但是根据this answer by nemesv,你最好使用@Html.Hidden 而不是@Html.Hiddenfor,就像这样:

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

因为 Html.Hiddenfor 试图从你的模型中预测 name 属性,这就是它与 Html.Hidden 不同的原因

【讨论】:

  • 我刚试过这个,虽然它改变了 ID 为“bb-post”和 Name="bb-post",但仍然有一个 name="bb_post"。所以现在有两个 Name 值,一个是小写的,一个是大写的。
  • @Fro1 好吧,对我来说它似乎有效,但显然这是 chrome 清理 html 的一种行为。nemesv 的这个答案给出了更详细的解释:stackoverflow.com/a/14810169/2422173.. 希望这会有所帮助!
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 2011-05-24
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
相关资源
最近更新 更多