Расширение ASP.Net MVC 2.0 Html.HiddenFor HtmlHelper не возвращает значение - PullRequest
5 голосов
/ 12 ноября 2009

Мы пытаемся обеспечить безопасность типов в наших представлениях и используем новый 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 ]

3 голосов
/ 16 августа 2010
2 голосов
/ 16 ноября 2009

Похоже, что механизм связывания модели, стоящий за методом расширения, не может преобразовать ваш тип данных FoodID в строку. Ваш тип данных - это обычный GUID?

Я знаю, что есть перегрузки для этого метода расширения для работы с двоичным файлом, но я не уверен насчет GUID ....

Вы пробовали отладку?

1 голос
/ 19 февраля 2013

Вы также можете свернуть свое собственное расширение, которое использует значение из свойства

@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());
    }
}
1 голос
/ 25 мая 2010

Я столкнулся с похожей проблемой, у меня есть один элемент модели - hiddeninput, я могу видеть правильное значение этого элемента при отображении представления (в качестве отладки я показываю его, чтобы проверить, что в представлении есть правильное значение), но после публикации В этом случае возвращаемое значение этого элемента сохраняется в первый раз, когда он был установлен, независимо от того, обновляю ли я отображение и проверяю ли правильное значение, отображаемое в представлении, но возвращаемое значение просто сохраняет значение, установленное в первый раз. Это странно.

...