TextBoxFor que muestra el valor inicial, no el valor actualizado del código

Tengo una aplicación MVC que muestra un valor. Este es el controlador:

public ActionResult Index(DataSites DataSiteList) { if (DataSiteList.Latitude != null) { DataSites test = new DataSites(); test.Latitude = "LATITUDE"; return View(test); } return View(DataSiteList); } public ActionResult SomeInformation() { DataSites test1 = new DataSites(); test1.Latitude = "LATITUDE2"; return RedirectToAction("Index", test1); } 

La vista:

 @model miniproj2.Models.DataSites 

@Html.TextBoxFor(x => x.Latitude)

Y el Modelo:

 public class DataSites { public string Latitude { get; set; } } 

Cuando voy a / Home / SomeInformation, la propiedad Latitude DataSites se establece en “LATITUDE2”. A continuación, redirige a la acción Index() en el controlador, establece la propiedad en “LATITUDE” y devuelve la vista.

Cuando muestra la vista, muestra el valor “LATITUDE2” como se establece en la redirección. ¿No debería mostrarse “LATITUDE”?

Tu problema es (paso a paso)

  1. Su método SomeInformation() establece el valor de test1.Latitude en “LATITUDE2”.
  2. Luego pasa ese modelo a su método Index() utilizando la sobrecarga de RedirectToAction que acepta un objeto. Internamente esto usa la reflexión para construir un RouteValueDictionary basado en las propiedades de su modelo (en este caso simplemente latitude="LATITUDE2" ).
  3. Cuando presionas el método Index , el modelo queda vinculado por DefaultModelBinder y ahora el valor de DataSiteList.Latitude es “LATITUDE2” (por lo que ingresas al bloque if )
  4. En el proceso de vinculación, DefaultModelBinder establece el valor ModelState de Latitude en “LATITUDE2”. Cualquier bash de establecer el valor de Latitude ahora se ignora porque la vista usa el valor de ModelState para representar el control.

No está claro qué estás tratando de hacer aquí. Puede hacer que funcione como espera agregando ModelState.Clear(); como la primera línea de su método Index() . Esto borra todos los valores de ModelState existentes ModelState ahora puede establecer el valor en “LATITUDE”.

Pero tu bloque if no tiene sentido. Tal vez estaba haciendo algún tipo de prueba, pero también puede eliminar el parámetro del método Index() y simplemente inicializar una nueva instancia de DataSites en el método.

Editar

Para dar un poco más de información sobre por qué actualizar una propiedad de modelo no tiene ningún efecto una vez que se ha establecido ModelState .

Imagine que tiene un formulario para recostackr información del usuario donde el modelo contiene int Age . Al usuario se le pide que ingrese su edad y alguien ingresa “¡Tengo cinco la próxima semana!”. Por supuesto, esto no se vinculará a un int, por lo que DefaultModelBinder agrega el valor (el ModelStateError ) y agrega un ModelStateError .

Cuando se devuelve la vista, normalmente mostrará un mensaje de error como “El campo Edad debe ser un número”. Si el helper html que representaba el control usaba el valor del modelo, mostraría “0” (el valor predeterminado para int). Sería algo confuso para el usuario ver “0” en el cuadro de texto y, a continuación, un mensaje que dice que debe ser un número ( ¡Qué !, pero cero es un número y ¿qué diablos pasó con lo que ingresé? ). Entonces, en cambio, el ayudante usa el valor de ModelState y ahora los usuarios ven “¡Tengo cinco la próxima semana!” y un mensaje de error asociado que tiene sentido para el valor.

Entonces, aunque pensabas que “no es lógico” , en realidad hay algo de lógica en este comportamiento.

No estás configurando Altitude. Será nulo por lo que el código nunca irá a este bloque y establecerá Lattitude en “LATTITUDE”

  if (DataSiteList.Altitude != null) { DataSites test = new DataSites(); test.Latitude = "LATITUDE"; return View(test); }