HTML.HiddenFor值集

arn*_*rob 45 asp.net-mvc html-helper asp.net-mvc-3 html.hiddenfor

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})
Run Code Online (Sandbox Code Playgroud)

它不起作用!如何设定价值?

小智 95

要在隐藏字段中设置值,请按以下方式执行:

@Html.HiddenFor(model => model.title, 
                new { id= "natureOfVisitField", Value = @Model.title})
Run Code Online (Sandbox Code Playgroud)

它会工作

  • 不,@ Ortund,小姐!否则,它应该从CAP开始;) (2认同)

Tej*_*gde 42

奇怪但是,试试@Value,大写"V"

例如(在MVC4上工作)

@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })
Run Code Online (Sandbox Code Playgroud)

更新:

发现@Value(大写V)创建了另一个带有"Value"和"value"的属性,使用小@value似乎也在起作用!

需要检查MVC源代码以找到更多信息.


更新,了解内部工作原理:

首先忘记所有这些解决方法(我为了连续性而保持这里),现在看起来很傻:)

基本上,它发生在发布模型并将模型返回到同一页面时.

使用以下代码片段在InputHelper方法(InputExtensions.cs)中访问(并形成html)该值

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));
Run Code Online (Sandbox Code Playgroud)

GetModelStateValue方法(在Htmlelper.cs中)检索值为

ViewData.ModelState.TryGetValue(key, out modelState)
Run Code Online (Sandbox Code Playgroud)

这是问题,因为从ViewData.ModelState字典访问该值.这将返回从页面发布的值而不是修改值!!

即如果你张贴的变量(例如Person.Id)的值是0,但你设置httpPost动作里面的值(例如Person.Id = 2),将ModelState中仍保留旧值"0"和attemptedValue含有"0" !所以渲染页面中的字段将包含"0"作为值!!

如果要将模型返回到同一页面,则解决方法:从ModelState清除项目,例如ModelState.Remove("Id");

这将从字典中删除该项, ViewData.ModelState.TryGetValue(key,out modelState)返回null,下一个语句(在InputExtensions.cs中)将实际值(valueParameter)传递给HiddenFor(m => m.Id )

这在InputExtensions.cs的以下行中完成

ModelState.Remove("Id"); 
Run Code Online (Sandbox Code Playgroud)

摘要:使用ModelState.Remove("...")清除ModelState中的项目;

希望这是有帮助的.

  • 我觉得这很奇怪,但似乎是正确的。我在控制器中添加了 ModelState.Remove("<columnName>") 并且我的问题消失了。 (2认同)
  • 带“V”的值对我有用,其实很奇怪!非常感谢。 (2认同)
  • 应将此答案的更新添加到已接受的答案中 - 这种见解非常宝贵!非常感谢您分享Tejasvi Hedge! (2认同)

Dan*_*ite 27

您不需要在attributes参数中设置值.MVC应该自动绑定它.

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField" })
Run Code Online (Sandbox Code Playgroud)


der*_*urg 10

这只是价值,而不是@value ..尝试一下.我不确定@ Model.title,也许它只是Model.title