54
@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})

它不起作用!如何设置值?

4

7 回答 7

104

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

@Html.HiddenFor(model => model.title, 
                new { id= "natureOfVisitField", Value = @Model.title})

它会工作

于 2013-05-02T05:08:45.513 回答
54

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

例如(在 MVC4 上工作)

@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })

更新:

发现@Value(大写 V)正在创建另一个带有“Value”和“value”的属性,使用小的 @value 似乎也有效!

需要查看 MVC 源代码才能找到更多信息。


更新,在了解了它的内部工作原理之后:

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

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

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

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));

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

ViewData.ModelState.TryGetValue(key, out modelState)

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

即,如果您发布的变量值(例如 Person.Id)为 0,但您在 httpPost 操作中设置了值(例如 Person.Id = 2),则 ModelState 仍保留旧值“0”,并且尝试值包含“0” !所以渲染页面中的字段将包含“0”作为值!

如果您将模型返回到同一页面,解决方法:从 ModelState 中清除项目,

例如

ModelState.Remove("Id"); 

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

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

tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

概括:

使用以下命令清除 ModelState 中的项目:

ModelState.Remove("...");

希望这会有所帮助。

于 2014-02-12T10:34:28.047 回答
29

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

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField" })
于 2012-09-03T13:51:25.793 回答
10

它只是价值,而不是@value.. 试试看。我不确定@Model.title,也许它只是Model.title

于 2012-09-03T13:53:40.237 回答
4

解决这个问题是因为我最近在尝试将相关属性添加到现有实体时遇到了这个问题。我刚刚完成了一个很好的扩展方法:

    public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, TProperty value)
    {
        string expressionText = ExpressionHelper.GetExpressionText(expression);
        string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionText);

        return htmlHelper.Hidden(propertyName, value);
    }

像这样使用:

@Html.HiddenFor(m => m.RELATED_ID, Related.Id)

请注意,这与内置的 HiddenFor 具有相似的签名,但使用通用类型,因此如果 Value 的类型为 System.Object,您实际上将调用框架中内置的类型。不知道为什么要在视图中编辑 System.Object 类型的属性...

于 2013-07-03T18:25:16.060 回答
0

当您尝试设置的“事物”是关键字 c# 时,使用指定 HtmlAttributes 时的 @ 符号。所以例如单词类,你不能指定类,你必须使用@class。

于 2018-04-13T13:35:35.787 回答
-1

你可以这样做

@Html.HiddenFor(model=>model.title, new {ng_init = string.Format("model.title='{0}'", Model.title) })
于 2018-10-26T09:57:07.247 回答