Asp.net mvc ASP.Net MVC 2.0 Html.HiddenFor HtmlHelper扩展不';t返回值

Asp.net mvc ASP.Net MVC 2.0 Html.HiddenFor HtmlHelper扩展不';t返回值,asp.net-mvc,asp.net-mvc-2,html-helper,Asp.net Mvc,Asp.net Mvc 2,Html Helper,我们试图在视图中实现类型安全,并使用新的ExpressionInputExtension HtmlHelpers,但我们看到了一些不一致的结果。我们的视图如下所示: ViewData.Model.FooID = <%= ViewData.Model.FooID %>< Model.FooID = <%= Model.FooID %> <%= Html.HiddenFor(x=>x.FooID) %> ViewData.Mode

我们试图在视图中实现类型安全,并使用新的ExpressionInputExtension HtmlHelpers,但我们看到了一些不一致的结果。我们的视图如下所示:

ViewData.Model.FooID = <%= ViewData.Model.FooID %><
Model.FooID = <%= Model.FooID  %>       
<%= Html.HiddenFor(x=>x.FooID) %>  
ViewData.Model.FooID=<
Model.FooID=
x、 食物)%>
但我们在渲染视图中看到的是:

ViewData.Model.FooID = 515b0403-e75b-4bd7-9b60-ef432f39d338
Model.FooID = 515b0403-e75b-4bd7-9b60-ef432f39d338    
<input id="FooID" name="FooID" type="hidden" value="" />  
ViewData.Model.FooID=515b0403-e75b-4bd7-9b60-EF432F3938
Model.FooID=515b0403-e75b-4bd7-9b60-EF432F3938
我可以手动添加以下内容:

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


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

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

我知道这个使用二进制的扩展方法有重载,但我不确定guid


你试过去bug吗?

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

看看这个:

您还可以滚动使用属性值的自己的扩展

@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());
    }
}
@Html.HiddenForField(m=>m.Location.CityRequired)
公共静态类隐藏扩展
{
公共静态MvcHtmlString HiddenForField(此HtmlHelper HtmlHelper,表达式),其中TModel:class
{
var metadata=modelmetada.FromLambdaExpression(表达式,htmlHelper.ViewData);
var值=metadata.Model;
返回htmlHelper.HiddenForField(表达式,值);
}
公共静态MvcHtmlString HiddenForField(此HtmlHelper HtmlHelper、表达式、对象值),其中TModel:class
{
字符串htmlFieldName=ExpressionHelper.GetExpressionText(表达式);
字符串fullName=htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName);
var标记=新标记生成器(“输入”);
tag.GenerateId(全名);
添加(“类型”、“隐藏”);
添加(“名称”,全名);
tag.Attributes.Add(“value”,value!=null?value.ToString():string.Empty);
返回新的MvcHtmlString(tag.ToString());
}
}

它实际上是一个可为空的?不,我还没有调试HtmlHelper扩展。模型绑定器将在控制器动作之前连接模型,但正确吗?我可以单步执行控制器操作,查看具有正确值的模型,甚至在视图中,我也可以查看具有正确值的模型。如果我直接访问属性,我甚至可以在视图中看到模型值的计算结果。我只是尝试了一下,效果很好:至少这样你仍然可以是类型安全的…是的。我可以这样做,但我试图避免使用“CustomerGuid”控件名。如果他们能给你一个扩展方法,比如Html.IdFor(x=>x.CustomerGuid),然后我就可以把它扔到我需要的任何地方,那就太好了。我不介意编写HTML,只是命名控件。谢谢