asp.net-mvc asp.net-mvc-3 html-helper html.hiddenfor

asp.net mvc - HTML.HiddenFor value set



asp.net-mvc asp.net-mvc-3 (6)

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = ''@Model.title''})

¡No funciona! cómo establecer el valor?


El símbolo @ al especificar HtmlAttributes se usa cuando la "cosa" que intenta establecer es una palabra clave c #. Entonces, por ejemplo, la clase de palabra, no puede especificar clase, debe usar @class.


Es solo valor, no valor. Inténtalo. No estoy seguro sobre @ Model.title, tal vez es solo Model.title


Extraño pero, prueba con @Value, capital "V"

ej. (trabajando en MVC4)

@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })

Actualizar:

Se encontró que @Value (capital V) está creando otro atributo con "Valor" junto con "valor", ¡aunque usar @value pequeño también parece estar funcionando!

Necesita verificar el código fuente de MVC para encontrar más.

Actualización, después de revisar cómo funciona internamente:

En primer lugar, olvide todas estas soluciones (me he mantenido aquí por el bien de la continuidad), ahora parece tonto :)

Básicamente, sucede cuando se publica un modelo y el modelo vuelve a la misma página.

Se accede al valor (y se forma en html) en el método InputHelper (InputExtensions.cs) usando el siguiente fragmento de código

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));

El método GetModelStateValue (en Htmlelper.cs) recupera el valor como

ViewData.ModelState.TryGetValue(key, out modelState)

Este es el problema, ya que se accede al valor desde el diccionario ViewData.ModelState. ¡Esto devuelve el valor publicado de la página en lugar del valor modificado!

es decir, si su valor publicado de la variable (por ejemplo, Person.Id) es 0 pero establece el valor dentro de la acción httpPost (por ejemplo, Person.Id = 2), el ModelState conserva el valor anterior "0" y el triedValue contiene "0" ! entonces el campo en la página renderizada contendrá "0" como valor !!

Solución alternativa si devuelve el modelo a la misma página: borre el elemento de ModelState, por ejemplo, ModelState.Remove ("Id");

Esto eliminará el elemento del diccionario y ViewData.ModelState.TryGetValue (key, out modelState) devuelve null , y la siguiente instrucción (dentro de InputExtensions.cs) toma el valor real ( valueParameter ) pasado a HiddenFor (m => m.Id )

esto se hace en la siguiente línea en InputExtensions.cs

tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

Resumen: borre el elemento en ModelState usando ModelState.Remove ("...");

Espero que esto sea útil.


Necroing esta pregunta porque recientemente me encontré con el problema, al tratar de agregar una propiedad relacionada a una entidad existente. Acabo de terminar haciendo un buen método de extensión:

public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, TProperty value) { string expressionText = ExpressionHelper.GetExpressionText(expression); string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionText); return htmlHelper.Hidden(propertyName, value); }

Úselo así:

@Html.HiddenFor(m => m.RELATED_ID, Related.Id)

Tenga en cuenta que esto tiene una firma similar al HiddenFor incorporado, pero utiliza el tipado genérico, por lo que si Value es de tipo System.Object, en realidad invocará el que está incorporado en el marco. Sin embargo, no estoy seguro de por qué editaría una propiedad de tipo System.Object en sus vistas ...


No debería necesitar establecer el valor en el parámetro de atributos. MVC debería atarlo automáticamente por usted.

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField" })


Para establecer el valor en el campo oculto hazlo de la siguiente manera:

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", Value = @Model.title})

Funcionará