2012-07-03 8 views
5

Tengo un cuadro combinado en una aplicación MVC3. Cuando se selecciona un nuevo elemento, devuelve una publicación como yo quiero. Todo bien allí. En el proceso, aparece una cadena de consulta y la leo en la carga de la página. Cuando la página se actualiza, lee la cadena de consulta y establece los otros controles según sea necesario.¿Cómo puedo detectar si mi página es el resultado de una devolución de datos?

Sin embargo, necesito detectar cuándo se vuelve a cargar la página, que es como resultado de una devolución de datos, a diferencia de la primera vez que se carga la página. Esto se debe a que cuando la página se carga inicialmente, todo se arruina hasta que alguien elige algo del cuadro combinado.

Sin embargo, un nuevo usuario del sitio no lo sabrá y verá un desastre.

Entiendo que las aplicaciones MVC3 no tienen el mismo contenido que ASP.Net tiene y por diversas razones que no entiendo, sé que de alguna manera no se considera "accaptable".

Sin embargo, estoy interesado en saber si existe una forma confiable 100% garantizada de diferenciar entre una primera carga de la página y una devolución de datos de la misma manera que en ASP.Net. Si existe tal forma, qué es y cómo puedo implementarlo.

he visto otro puesto de que hacer esto:

public bool IsPostBack 
    { 
     get 
     { 
      return ViewBag.IsPostBack = (Request.HttpMethod == "POST"); 
     } 
    } 

pero he leído en otros lugares que esto es siempre cierto. Por lo tanto, si esto es siempre cierto, también será cierto en la primera carga y, al ser así, no puedo decir con fiabilidad si se trata de una devolución de datos o no. Sé que por supuesto es una devolución de datos de algún tipo. Pero no lo es si es una primera carga.

¿Alguien me puede ayudar con una respuesta a esto por favor? También estoy usando el motor de vista Razor en comparación con los motores de vista aspx estándar.

+0

no hay 'post backs' en asp.net mvc –

+0

Sería interesante ver cómo está codificando sus acciones. La forma más común de detectar esto es: GET es para solicitar por primera vez (es decir, no es una devolución de datos) y POST, obviamente, sería una devolución de datos. –

+0

Aún está pensando en la aplicación en una arquitectura de formularios web. Esto es Bad ™. Deberías echar un vistazo a algunos tutoriales de MVC3. – Tyrsius

Respuesta

14

En MVC, que suelen tener diferentes acciones para GET y POST:

[HttpGet] // Actions are GET by default, so you can omit this 
public ActionResult YourAction(int id) 
{ 
    // GET 
} 

[HttpPost] 
public ActionResult YourAction(YourModel model) 
{ 
    // POST 
} 

Si sigue este patrón, no hay necesidad de preocuparse por una propiedad similar a Page.IsPostBack.

+0

¡En realidad, esto tiene sentido! En los últimos meses, acabo de eliminar estos atributos ya que se repitió mucho código en 2 lugares. Gracias por la explicación. En agudeza mental, sé que me matarán por decir esto. Pero uno podría simular una propiedad IsPostBack si quisieran saber esto. Pero ahora veo por qué no se necesita uno. –

4

Como dijiste, no hay ninguna noción de Postback en ASP.NET MVC. Lo que hace frío es probar el verbo HTTP que se utilizó para realizar la solicitud para ver si es POST. Esto podría ser o bien después de un envío de formularios o una petición AJAX:

public ActionResult Foo() 
{ 
    if (string.Equals("post", Request.HttpMethod, StringComparison.OrdinalIgnoreCase) 
    { 
     // The POST verb was used to invoke the controller action 
    } 
    ... 
} 
+0

Me gusta esto (y ahora aprendí a usar string.equals también) Ahora solo tengo que averiguar por qué usaría string.equals en lugar de myString == someOtherString. Pero esa es otra pregunta a menos que quieras salvarme el problema. Gracias por su respuesta, +1. –

3

Se puede decorar la acción con los atributos propios

[HttpGet] 
public ActionResult Foo() { 
    //Do pre-postback stuff here 
} 

[HttpPost] 
public ActionResult Foo() { 
    //Do postback stuff here 
} 
+0

Gracias por su respuesta. Hubiera usado esto como la respuesta aceptada, pero alguien me proporcionó una explicación un poco mejor. Sin embargo, estoy agradecido por su tiempo. +1 –

+1

@jsmith ¿No daría eso un error diciendo que 'Foo' ya existe en el mismo contexto? – lbrahim

+0

+1 a @ Md.La respuesta de Ibrahim es incorrecta debido a que la sobrecarga es la misma.Necesita cambiar la firma de Foo() en uno de los métodos para que se puedan diferenciar. – joedotnot

Cuestiones relacionadas