HTML.HiddenFor值集

时间:2012-09-03 13:49:54

标签: asp.net-mvc asp.net-mvc-3 html-helper html.hiddenfor

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})
它不起作用!如何设置值?

7 个答案:

答案 0 :(得分:85)

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

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

它会起作用

答案 1 :(得分:35)

奇怪但是,尝试@Value,大写“V”

e.g。 (致力于MVC4)

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

更新

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

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


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

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

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

使用以下代码片段

在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”和 attemptsValue 包含“0”!所以渲染页面中的字段将包含“0”作为值!!

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

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

这在InputExtensions.cs

中的以下行中完成
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

要点: 使用ModelState.Remove(“...”);

清除ModelState中的项目

希望这有用。

答案 2 :(得分:24)

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

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

答案 3 :(得分:10)

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

答案 4 :(得分: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类型的属性,但是......

答案 5 :(得分:0)

指定HtmlAttributes时的@符号用于&#34;&#34;&#34;你想设置的是关键字c#。所以例如单词class,你不能指定类,你必须使用@class。

答案 6 :(得分:0)

您可以这样做

@Html.HiddenFor(model=>model.title, new {ng_init = string.Format("model.title='{0}'", Model.title) })