2009-11-12 14 views
5

Estamos tratando de ser seguro en cuanto al tipo de letra en nuestras vistas y usar el nuevo ExpressionInputExtenssion HtmlHelpers, pero estamos viendo algunos resultados inconsistentes. Tenemos una visión que tiene este aspecto:ASP.Net MVC 2.0 Html.HiddenFor HtmlHelper extension no devuelve el valor

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

Pero lo que vemos en la vista renderizada es la siguiente:

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

puedo añadir manualmente este:

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

Pero ahora ya no están, pero sorprendentemente cuando lo hago, The Html.HiddenFor siempre tiene el valor correcto.

Respuesta

2

Parece que la carpeta modelo que está detrás del método de extensión no puede convertir su tipo de datos FoodID en una cadena. ¿Su tipo de datos es un GUID regular?

me conocen hay sobrecargas de este método de extensión para trabajar con el binario, pero no estoy seguro acerca de los GUID ....

u han intentado debbuging ella?

+0

realidad, es un anulable ? No, aún no he depurado la extensión HtmlHelper. ¿El encuadernador del modelo debería cablear el modelo antes de la acción del controlador, aunque es correcto? Puedo pasar por mi acción de controlador, verme el modelo con el valor correcto, e incluso en la vista puedo ver el modelo con el valor correcto. Incluso puedo ver el valor del modelo evaluar en la vista si accedo a la propiedad directamente. – Mark

+0

Acabo de probar esto y funciona bien: <% = Html.Hidden ("CustomerGuid", item.CustomerGuid)%> Al menos de esta manera todavía puede ser seguro de tipo ... –

+0

Sí. Podría hacerlo, pero estaba tratando de evitar el nombre de control "CustomerGuid". Sería bueno si simplemente te dieran un método de extensión como Html.IdFor (x => x.CustomerGuid) y luego podría lanzarlo donde sea que lo necesite. No me importa escribir el código HTML, solo nombrar el control. ¡Gracias! – Mark

1

Me encontré con un problema similar, tengo un elemento del modelo es hiddeninput, puedo ver el valor correcto de este elemento mientras se muestra la vista (como la depuración lo muestro para comprobar que hay un valor correcto en la vista), pero una vez publicar la vista, el valor de retorno de este elemento permanece la primera vez que se configuró, sea lo que sea que actualice la pantalla y asegúrese de que el valor correcto se muestre en la vista, pero el valor de retorno simplemente mantenga el valor establecido por primera vez. Esto es raro.

1

También puede rodar su propia extensión que utiliza el valor de la propiedad

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