TextBoxPara mostrar el valor inicial, no el valor actualizado desde el código [duplicado]

Resuelto Adrien Tancrez asked hace 10 años • 2 respuestas

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' Latitudese 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"?

Adrien Tancrez avatar Oct 30 '14 20:10 Adrien Tancrez
Aceptado

Tu problema es (paso a paso)

  1. Su SomeInformation()método establece el valor de test1.Latitude "LATITUDE2".
  2. Luego pasas ese modelo a tu Index()método usando la sobrecarga que RedirectToActionacepta un objeto. Internamente, esto utiliza la reflexión para construir un RouteValueDictionarymodelo basado en las propiedades de su modelo (en este caso es simplemente latitude="LATITUDE2").
  3. Cuando presionas el Indexmétodo, el modelo está vinculado por DefaultModelBindery ahora el valor de DataSiteList.Latitudees "LATITUDE2" (razón por la cual ingresas el ifbloque)
  4. En el proceso de vinculación, DefaultModelBinderestablece el ModelStatevalor de Latitude"LATITUDE2". Cualquier intento de establecer el valor de Latitudeahora se ignora porque la vista usa el ModelStatevalor 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 ModelStatelos valores existentes y ahora puede establecer el valor en "LATITUDE".

Pero tu ifbloqueo 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 DataSitesen 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 ModelStatese 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 DefaultModelBinderagrega 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 ModelStatey 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.

 avatar Oct 30 '2014 22:10