TextBoxPara mostrar el valor inicial, no el valor actualizado desde el código [duplicado]
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
<p>
@Html.TextBoxFor(x => x.Latitude)
</p>
Y el modelo:
public class DataSites
{
public string Latitude { get; set; }
}
Cuando voy a /Home/SomeInformation, la propiedad DataSites
' Latitude
se establece en "LATITUDE2". Luego redirige a la Index()
acción en el controlador, establece la propiedad en "LATITUDE" y devuelve la vista.
Cuando muestra la vista, muestra el valor "LATITUDE2" tal como se establece en la redirección. ¿No debería mostrarse "LATITUDE"?
Tu problema es (paso a paso)
- Su
SomeInformation()
método establece el valor detest1.Latitude
"LATITUDE2". - Luego pasas ese modelo a tu
Index()
método usando la sobrecarga queRedirectToAction
acepta un objeto. Internamente, esto utiliza la reflexión para construir unRouteValueDictionary
modelo basado en las propiedades de su modelo (en este caso es simplementelatitude="LATITUDE2"
). - Cuando presionas el
Index
método, el modelo está vinculado porDefaultModelBinder
y ahora el valor deDataSiteList.Latitude
es "LATITUDE2" (razón por la cual ingresas elif
bloque) - En el proceso de vinculación,
DefaultModelBinder
establece elModelState
valor deLatitude
"LATITUDE2". Cualquier intento de establecer el valor deLatitude
ahora se ignora porque la vista usa elModelState
valor para representar el control.
No está claro qué intentas hacer aquí. Puede hacer que funcione como espera agregando ModelState.Clear();
como primera línea de su Index()
método. Esto borra todos ModelState
los valores existentes y ahora puede establecer el valor en "LATITUDE".
Pero tu if
bloqueo no tiene sentido. Quizás solo estaba haciendo algún tipo de prueba, pero también puede eliminar el parámetro del Index()
método e inicializar una nueva instancia DataSites
en el método.
Editar
Para brindar un poco más de información sobre por qué la actualización de una propiedad del modelo no tiene ningún efecto una vez que ModelState
se ha establecido.
Imagine que tiene un formulario para recopilar información del usuario donde el modelo contiene int Age
. Se le pide al usuario que ingrese su edad y alguien ingresa "¡La semana que viene cumpliré cinco años!". Por supuesto, esto no se vinculará a un int, por lo que DefaultModelBinder
agrega el valor (el attemptedValue
) 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 asistente HTML que representa el control usó el valor del modelo, entonces mostraría "0" (el valor predeterminado para int). Sería algo confuso para el usuario ver "0" en el cuadro de texto y luego 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 lugar de eso, el asistente usa el valor de ModelState
y ahora los usuarios ven "¡Cumpliré cinco la semana que viene!". y un mensaje de error asociado que tenga sentido para el valor.
Entonces, aunque pensó que "no es lógico" , en realidad hay algo de lógica en este comportamiento.