首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >值错误的ASP.Net MVC Html.HiddenFor

值错误的ASP.Net MVC Html.HiddenFor
EN

Stack Overflow用户
提问于 2011-01-17 14:10:41
回答 4查看 36.2K关注 0票数 135

我在我的项目中使用MVC3,我看到了一个非常奇怪的行为。

我正在尝试为我的Model上的特定值创建一个隐藏字段,问题是由于某些原因,在该字段上设置的值与Model中的值不对应。

例如:

我有这段代码,只是作为测试:

代码语言:javascript
复制
<%:Html.Hidden("Step2", Model.Step) %>
<%:Html.HiddenFor(m => m.Step) %>

我认为这两个隐藏字段应该具有相同的值。我所做的是,在第一次显示视图时将值设置为1,然后在提交后将Model字段的值增加1。

所以,第一次呈现页面时,两个控件的值都是1,但第二次呈现的值是:

代码语言:javascript
复制
<input id="Step2" name="Step2" type="hidden" value="2" />
<input id="Step" name="Step" type="hidden" value="1" />

正如您所看到的,第一个值是正确的,但第二个值似乎与我第一次显示视图时相同。

我遗漏了什么?*For Html帮助器是否以某种方式缓存值?如果是,我如何禁用此缓存?

谢谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-17 15:29:35

这很正常,也是HTML助手的工作方式。它们首先使用POST请求的值,然后使用模型中的值。这意味着,即使您在控制器操作中修改了模型的值,如果POST请求中有相同的变量,您的修改也将被忽略,并将使用POSTed值。

一种可能的解决方法是在尝试修改该值的控制器操作中从模型状态中删除该值:

代码语言:javascript
复制
// remove the Step variable from the model state 
// if you want the changes in the model to be
// taken into account
ModelState.Remove("Step");
model.Step = 2;

另一种可能是编写一个自定义的HTML帮助器,它将始终使用模型的值并忽略POST值。

还有另一种可能性:

代码语言:javascript
复制
<input type="hidden" name="Step" value="<%: Model.Step %>" />
票数 196
EN

Stack Overflow用户

发布于 2013-08-16 22:53:47

我在编写向导时遇到了同样的问题,该向导在每一步都显示较大模型的不同部分。

来自“步骤1”的数据和/或错误会与“步骤2”混淆,等等,直到我最终意识到ModelState是“罪魁祸首”。

这是我的简单解决方案:

代码语言:javascript
复制
if (oldPageIndex != newPageIndex)
{
    ModelState.Clear(); // <-- solution
}

return View(model[newPageIndex]);
票数 21
EN

Stack Overflow用户

发布于 2014-10-10 18:08:13

此代码将不起作用

代码语言:javascript
复制
// remove the Step variable from the model state
// if you want the changes in the model to be
// taken into account
ModelState.Remove("Step");
model.Step = 2;

...because HiddenFor always (!)从ModelState读取,而不是模型本身。如果它找不到"Step“键,它将为该变量类型生成默认值,在本例中为0

以下是解决方案。我是为自己写的,但不介意分享它,因为我看到很多人都在为这个顽皮的HiddenFor助手而苦苦挣扎。

代码语言:javascript
复制
public static class CustomExtensions
{
    public static MvcHtmlString HiddenFor2<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        ReplacePropertyState(htmlHelper, expression);
        return htmlHelper.HiddenFor(expression);
    }

    public static MvcHtmlString HiddenFor2<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        ReplacePropertyState(htmlHelper, expression);
        return htmlHelper.HiddenFor(expression, htmlAttributes);
    }

    public static MvcHtmlString HiddenFor2<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
    {
        ReplacePropertyState(htmlHelper, expression);
        return htmlHelper.HiddenFor(expression, htmlAttributes);
    }

    private static void ReplacePropertyState<TModel, TProperty>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        string text = ExpressionHelper.GetExpressionText(expression);
        string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(text);
        ModelStateDictionary modelState = htmlHelper.ViewContext.ViewData.ModelState;
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

        if (modelState.ContainsKey(fullName))
        {                
            ValueProviderResult currentValue = modelState[fullName].Value;
            modelState[fullName].Value = new ValueProviderResult(metadata.Model, Convert.ToString(metadata.Model), currentValue.Culture);
        }
        else
        {
            modelState[fullName] = new ModelState
            {
                Value = new ValueProviderResult(metadata.Model, Convert.ToString(metadata.Model), CultureInfo.CurrentUICulture)
            };
        }
    }
}

然后,您只需在视图中像往常一样使用它:

代码语言:javascript
复制
@Html.HiddenFor2(m => m.Id)

值得一提的是,它也适用于集合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4710447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档