Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC 4重写发出的html名称和id_Asp.net Mvc_Asp.net Mvc 4_Razor 2 - Fatal编程技术网

Asp.net mvc ASP.NET MVC 4重写发出的html名称和id

Asp.net mvc ASP.NET MVC 4重写发出的html名称和id,asp.net-mvc,asp.net-mvc-4,razor-2,Asp.net Mvc,Asp.net Mvc 4,Razor 2,我正在尝试更改由@html.HiddenFor创建的html输入的发出名称 我使用的代码如下: @Html.HiddenFor(e => e.SomeProperty, new { @id = "some_property", @name = "some_property" } 现在这适用于id,但不适用于名称。现在我并不真正关心id现在,我需要更改名称,因为这是被发布回目标服务器的名称 有吗 我可以在模型中的SomeProperty上应用的属性 Html.HiddenFor中重写na

我正在尝试更改由
@html.HiddenFor
创建的html输入的发出名称

我使用的代码如下:

@Html.HiddenFor(e => e.SomeProperty, new { @id = "some_property", @name = "some_property" }
现在这适用于
id
,但不适用于名称。现在我并不真正关心
id
现在,我需要更改
名称
,因为这是被发布回目标服务器的名称

有吗

  • 我可以在模型中的
    SomeProperty
    上应用的属性
  • Html.HiddenFor
    中重写
    name
    属性的方法
还是我一直坚持手工编写一个简单的

您需要使用(或手工写出
)而不是
Html.HiddenFor

@Html.Hidden("some_property", Model.SomeProperty, new { @id = "some_property" })
强类型帮助程序(例如名称以“For”结尾的帮助程序,如
HiddenFor
)的目标是从提供的表达式中猜测输入名称。因此,如果您想要一个“自定义”输入名称,您可以始终使用常规帮助程序,如
Html.Hidden
,在这里您可以显式设置名称

错误,因为它生成的HTML无效

使用该解决方案可生成两个
名称
属性:

<input  Name="some_property"  name="SomeProperty" id="some_property" type="hidden" value="test" /> 

因此,您将拥有
Name=“some_property”
Name=“SomeProperty”
这两个无效的HTML,因为一个输入只能有一个
属性!(尽管大多数浏览者碰巧使用了第一个
Name=“some_property”
,而不关心第二个…

如果您使用:

@HiddenFor(e=>e.SomeProperty,新的{@id=“some_property”, @Name=“some_property”})


注意@Name中的大写字母“N”。它会起作用。

我很好奇为什么专门重写name属性不起作用。除非我将它大写(即
new{@Name='somename'}
),否则它似乎不起作用。正如其他人所指出的,这只是因为它会生成重复的名称属性,而Chrome会将其清除

我查看了最新的MVC源代码以了解发生了什么。在 Debug THMLGEng.C.<代码> > < /P>中,考虑以下代码:
var fullName = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression);
if (string.IsNullOrEmpty(fullName))
{
    throw new ArgumentException(
    ...
}

var inputTypeString = GetInputTypeString(inputType);
var tagBuilder = new TagBuilder("input");
tagBuilder.TagRenderMode = TagRenderMode.SelfClosing;
tagBuilder.MergeAttributes(htmlAttributes);
tagBuilder.MergeAttribute("type", inputTypeString);
tagBuilder.MergeAttribute("name", fullName, replaceExisting: true);
我们可以在这里看到,问题是,无论您提供什么名称属性,它都将被最后一次调用
MergeAttribute
覆盖,该调用将使用从
GetFullHtmlFieldName
方法分配给变量
fullName
的任何逻辑

我有点理解他们为什么强制执行这种行为,猜测这与控制回发中使用的名称有关,以保证它与模型绑定器一起工作

在任何情况下,为了实现这一点,我建议只需手动构造输入元素,而不要使用razor视图助手。

对我来说从来都不起作用(aspnet.core)

我用普通的

<input type="hidden" id="@myid" name="@myname" value="@Model.prop" />


工作起来很有魅力。不需要HtmlHelper HiddenForModel。

在MVC上为我工作4@MiniRagnarok不,它不好用。您将得到两个名称属性。因为上面的代码生成了
,其中您有
Name=“some_property”
Name=“SomeProperty”
,这是无效的HTML!(虽然大多数浏览者碰巧会选择第一个
Name=“some_property”
,而不关心第二个…@nemesv,但这不是我得到的。我得到
。我没有得到两个name属性,我检查了源代码。这是MVC4上的。-1这不行。Chrome(或任何其他浏览器)会更正错误的html,这并不意味着呈现正确的html。请不要用这个。如果chrome更改了修复方法,那么当然会呈现无效的html。不起作用,chrome正在清理html。否决此回答我在.EditorFor()中遇到了类似的问题。我使用了这个技巧,还指定了TextBox(而不是编辑器)。谢谢您甚至不需要包含
new{@id=“some_property”
}对吗
@Html.Hidden
将生成一个id和一个名称?为什么
@id
@name
?C#关键字也不是?@nmit026是的,您不需要id和
@
,因为它们不是关键字。我刚刚将问题中的代码复制到我的答案中。@sovemp我的答案确实有效,而且它与
name
属性也有效:如果使用
Html.Hidden
第一个参数将用作名称:
@Html.Hidden(“somePopertyName”,“someValue”,new{@id=“some\u property”})
它将生成
,或者您可以手动构建输入(正如我在回答的第一行中也提到的),正如您得出的结论…@nemesv哦,好的,很抱歉我误解了。我将编辑我的答案以反映这一点。一个小建议,也许在你的答案中,对name和id使用不同的值,使其更加明显,而不是对两者都使用“some_属性”