我们试图在视图中保持类型安全并使用新的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总是有正确的价值。
答案 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());
}
}