2009-04-22 20 views
13

Lo sé, lo sé, lo sé. No debería estar haciendo formas web dentro de MVC, estoy completamente de acuerdo. Pero, las personas que firman mi cheque de pago no aprobarán una conversión completa de nuestro sitio a MVC en este momento. Así que estoy tomando pasos incrementales, página por página, para convertirlos mientras agrego nuevas características en MVC.ASP.NET MVC - ¿Ya está IsPostBack aquí?

Entonces mi pregunta es ¿cómo puedo acceder a la propiedad IsPostBack desde un controlador?

Editar: Para aclarar más, tengo un control de usuario de formulario web en mi página maestra mvc que puede iniciar devoluciones. Estoy tratando de identificar estos postbacks versos de una publicación de mvc. En este punto, creo que solo voy a verificar las claves de formulario de solicitud para una clave "__viewstate" y si se encuentra tratarla como una devolución de datos.

+0

'pública IsPostBack static bool (esta solicitud HttpRequestBase) {return __viewstate-something-something} 'es probablemente lo más cercano que obtendrás. Pero colocar controles de usuario de formulario web en páginas maestras de MVC podría romperse en versiones futuras de ASP.NET MVC. – bzlm

+0

¿Por qué no deberíamos usar formularios web dentro de MVC? Estoy usando formularios web. Pero no soy profesional ¿Qué más podemos usar que no sean formularios web? –

Respuesta

3

Los controladores no heredan de System.Web.UI.Page. No hay propiedad isPostback.

+1

ASP.NET View Engine Views hereda de Page. –

+2

Soy corregido. Las vistas lo hacen Los controladores no. –

0

El marco MVC no es compatible con el clásico postback y viewstate utilizados en los formularios web. Entonces, no, no tienes acceso a IsPostBack.

Mi consejo es que tenga dos ramas: una con el sitio actual donde está agregando parches para errores conocidos y otra donde crea un nuevo sitio desde cero. Nuevas características deberían ser implementadas en este. Supongo que la mayor parte de su base de código se puede reutilizar en el nuevo sitio.

Cuando el nuevo sitio esté listo, póngalo en producción.

13

No hay IsPostBack - todo es un POST o GET (u otro verbo HTTP). Puede limitar los verbos HTTP que su acción permita, es decir, nunca verá una solicitud de un verbo no permitido, utilizando AcceptVerbsAttribute. Por ejemplo, lo siguiente solo permite POST.

[AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult Update(int id) 
    { 
    } 

Si usted necesita tener el mismo nombre de la acción no tanto GET/POST y que realmente hacen cosas diferentes, puede darles firmas separadas o utilizar el ActionNameAttribute poner un alias para una de las acciones por lo que los métodos pueden tener diferentes nombres

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult List() 
    { 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult List(string filter, int page, int limit) 
    { 
    } 

O

[ActionName("List")] 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult ListDisplay() 
    { 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult List() 
    { 
    } 

EDITAR: Tenga en cuenta que he añadido el token de validación antiforgery a las acciones POST. Deberías usar esto para protect against cross-site scripting attacks.

+0

En realidad, todavía hay backs de publicaciones al mezclar páginas de mvc y webforms. Ver mi edición arriba. – chief7

0

¿Por qué intentas obtener ese valor desde un controlador? No estoy seguro si esto lo ayudará, pero aún puede usar el objeto Solicitud tradicional para obtener información enviada por un formulario ...

0

No estoy seguro de haber entendido su pregunta correctamente, pero en el controlador tendría una acción que maneja el GET inicial desde el navegador y una segunda acción para manejar los POST.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(MyModel model) 
{...} 

public ActionResult Create() 
{...} 
0

Sin duda, eche un vistazo a esta entrada del blog de Scott Hanselman donde se pone una página aspx en una aplicación MVC.

http://www.hanselman.com/blog/PlugInHybridsASPNETWebFormsAndASPMVCAndASPNETDynamicDataSideBySide.aspx

Sus controladores no tendrán acceso a la propiedad ViewState.Incluso si quisiera manejar el problema de __VIEWSTATE, tendría que hacer algún trabajo para poder utilizarlo en un controlador de mvc. Buena suerte al idear una estrategia de conversión, sin importar cómo resulte, mucha gente estaría interesada en saber qué tipo de problemas enfrentarías en el proceso.

32

Por si alguien todavía está interesado, puede probar para un puesto desde el interior de un método de acción MVC así:

if (Request.HttpMethod=="POST") { 

} 
+0

¡Gracias por esto, esta es la forma exacta en que necesita hacerlo en MVC! –

+2

EVITE ESTO A TODA COSTA. Su código de controlador debe estar organizado por métodos. Su método HttpGet es decir [HttpGet] debe estar completamente separado de su método [HttpPost]. Hay muchas razones para esto, la capacidad de prueba es uno, la legibilidad, etc. Consulte la respuesta de tvanfosson a continuación. –

+1

sigue siendo útil en 2012 +1 para que –

0

Si usted tiene más de una forma en una página MVC, se puede añadir un escondido ingrese dentro del formulario con un ID significativo y pruebe si tiene un valor. De esta forma, no necesita tener dos manejadores separados (uno para obtener y otro para la publicación).

Así inf la página y en el interior de la forma:

<input type="hidden" id="testForm" name="testForm" value="1"/> 

Y en el controlador:

if (Request.Form["testForm"] != null) 
     { 
     // ACTIONS FOR THE POSTED FORM 
     } 

espero que ayude!

7

Se puede utilizar esta pieza de código en la maquinilla de afeitar

@if(IsPost) 
{ 
//dosomething 
} 
else 
{ 
//do some other thing 
} 
3

A menudo utilizo este método (declarado en mi clase BaseController)

protected bool IsPostBack() 
{ 
    bool isPost = string.Compare(Request.HttpMethod, "POST", 
     StringComparison.CurrentCultureIgnoreCase) == 0; 
    if (Request.UrlReferrer == null) return false; 

    bool isSameUrl = string.Compare(Request.Url.AbsolutePath, 
     Request.UrlReferrer.AbsolutePath, 
     StringComparison.CurrentCultureIgnoreCase) == 0; 

    return isPost && isSameUrl; 
} 
Cuestiones relacionadas