Solución:
Para configurar el valor en el campo oculto, haga lo siguiente:
@Html.HiddenFor(model => model.title,
new { id= "natureOfVisitField", Value = @Model.title})
Funcionará
Extraño pero, prueba con @Value
, capital "V"
p. ej. (trabajando en MVC4)
@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })
Actualizar:
Descubrí que @Value (V mayúscula) está creando otro atributo con “Value” junto con “value”, ¡el uso de @value pequeño parece estar funcionando también!
Necesito verificar el código fuente de MVC para encontrar más.
Actualización, después de ver cómo funciona internamente:
En primer lugar, olvídese de todas estas soluciones (las he mantenido en aras de la continuidad aquí), ahora parece una tontería 🙂
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)
Aquí está el problema, ya que se accede al valor desde ViewData.ModelState
diccionario. ¡Esto devuelve el valor publicado desde 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), ModelState aún conserva el valor anterior “0” y el intentValue contiene “0”! por lo que 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,
p.ej
ModelState.Remove("Id");
Esto eliminará el elemento del diccionario y la
ViewData.ModelState.TryGetValue (clave, out modelState) devuelve nulo, 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 de ayuda.
No debería necesitar establecer el valor en el parámetro de atributos. MVC debería vincularlo automáticamente por usted.
@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField" })