ASP.Net MVC 2.0中的Html.HiddenFor HtmlHelper扩展未返回Value值

5
我们尝试在视图中实现类型安全,并使用新的ExpressionInputExtension 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个回答

3

2

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

我知道这个扩展方法有用于处理二进制数据的重载,但是我不确定GUID是否适用....

你尝试过调试吗?


这实际上是一个Nullable<Guid>吗?不,我还没有调试HtmlHelper扩展。模型绑定器会在控制器操作之前连接模型,对吗?我可以逐步执行我的控制器操作,查看具有正确值的模型,甚至在视图中,如果我直接访问属性,我可以看到模型的正确值。 - Mark
我刚试了一下,运行得很好: <%= Html.Hidden("CustomerGuid", item.CustomerGuid) %> 至少这样你仍然可以保持类型安全... - Andre Gallo
是的。我可以做到这一点,但我试图避免使用“CustomerGuid”控件名称。如果他们能提供一个类似Html.IdFor(x => x.CustomerGuid)的扩展方法,那就太好了,我可以在需要的任何地方使用它。我不介意编写HTML,只是控件的命名。谢谢! - Mark

1
我遇到了类似的问题,我的模型中有一个hiddeninput元素,在显示视图时我可以看到这个元素的正确值(作为调试,我将其显示出来以检查视图中是否有正确的值),但是一旦我提交视图后,该元素的返回值仍然保持第一次设置的值,无论我如何刷新显示并确保视图上显示了正确的值,但是返回值仍然保持第一次设置的值。这很奇怪。

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());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接