ASP.Net MVC 2.0 Html.HiddenFor HtmlHelper扩展不返回Value

时间:2009-11-12 19:54:05

标签: asp.net-mvc asp.net-mvc-2 html-helper

我们试图在视图中保持类型安全并使用新的ExpressionInputExtenssion HtmlHelpers,但我们看到一些不一致的结果。我们有一个看起来像这样的观点:

ViewData.Model.FooID = <%= ViewData.Model.FooID %><
Model.FooID = <%= Model.FooID  %>       
<%= Html.HiddenFor(x=>x.FooID) %>  

但我们在渲染视图中看到的是:

ViewData.Model.FooID = 515b0403-e75b-4bd7-9b60-ef432f39d338
Model.FooID = 515b0403-e75b-4bd7-9b60-ef432f39d338    
<input id="FooID" name="FooID" type="hidden" value="" />  

我可以手动添加:

<input id="FooID" name="FooID" type="hidden" value="<%= Model.FooID %>" />

但现在我们已经不在了,但令人惊讶的是,当我这样做时,Html.HiddenFor总是有正确的价值。

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

看起来扩展方法后面的模型绑定器无法将FoodID数据类型转换为字符串。您的数据类型是常规GUID吗?

我知道这个扩展方法有重载用于处理二进制文件,但我不确定GUID ....

您是否尝试过对其进行重组?

答案 2 :(得分:1)

我遇到了类似的问题,我有一个模型的元素是hiddeninput,我可以在显示视图时看到这个元素的正确值(作为调试我显示它来查看视图中的正确值),但是一旦我发布了在视图中,此元素的返回值保持第一次设置,无论我刷新显示并确保视图上显示的值正确,但返回值只保留第一次设置的值。这很奇怪。

答案 3 :(得分:1)

您也可以使用属性

中的值滚动自己的扩展程序
@Html.HiddenForField(m => m.Location.CityRequired)

public static class HiddenExtensions
{
    public static MvcHtmlString HiddenForField<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression) where TModel : class
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        var value = metadata.Model;
        return htmlHelper.HiddenForField(expression, value);
    }

    public static MvcHtmlString HiddenForField<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object value) where TModel : class
    {
        string htmlFieldName = ExpressionHelper.GetExpressionText(expression);
        string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName);
        var tag = new TagBuilder("input");
        tag.GenerateId(fullName);
        tag.Attributes.Add("type", "hidden");
        tag.Attributes.Add("name", fullName);
        tag.Attributes.Add("value", value != null ? value.ToString() : string.Empty);
        return new MvcHtmlString(tag.ToString());
    }
}