web-dev-qa-db-fra.com

ASP.NET MVC - IsPostBack est-il toujours là?

Je sais, je sais, je sais. Je ne devrais pas faire de formulaires Web dans MVC, je suis tout à fait d’accord. Mais les personnes qui signent mon chèque de règlement n'approuveront pas pour l'instant une conversion complète de notre site en MVC. Je suis donc en train de prendre des mesures incrémentielles, page par page, pour les convertir tout en ajoutant de nouvelles fonctionnalités dans MVC.

Ma question est donc comment puis-je accéder à la propriété IsPostBack à partir d'un contrôleur?

Modifier: Pour plus de clarté, j’ai un contrôle utilisateur de formulaire Web sur ma page maître mvc qui peut initier des publications. J'essaie d'identifier ces postbacks vers un post MVC. À ce stade, je pense que je vais simplement vérifier les clés du formulaire de demande pour une clé "__viewstate" et si elle est trouvée, la traiter comme une publication.

15
chief7

Si vous êtes toujours intéressé, vous pouvez tester un POST depuis une méthode d'action MVC comme celle-ci:

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

}
37
Nuri

Il n'y a pas IsPostBack - tout est soit un POST ou un GET (ou un autre verbe HTTP). Vous pouvez limiter les verbes HTTP autorisés par votre action, c'est-à-dire que vous ne verrez jamais une demande d'un verbe non autorisé à l'aide de AcceptVerbsAttribute. Par exemple, ce qui suit autorise uniquement les POST.

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

Si vous avez besoin du même nom d'action, effectuez les opérations GET/POST et effectuez des tâches différentes. Vous pouvez leur attribuer des signatures distinctes ou utiliser ActionNameAttribute pour aliaser l'une des actions afin que les méthodes puissent porter des noms différents.

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

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

OR

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

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

EDIT: Notez que j'ai ajouté la validation du jeton antiforgery aux actions POST. Vous devriez vraiment l'utiliser pour vous protéger contre les attaques de script entre sites .

13
tvanfosson

Vous pouvez utiliser ce morceau de code dans Razor

@if(IsPost)
{
//dosomething
}
else
{
//do some other thing
}
9
ASP.Net Developer

J'utilise souvent cette méthode (déclarée sur ma classe 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;
 }
4
ibirite

Les contrôleurs n'héritent pas de System.Web.UI.Page. Il n'y a pas de propriété isPostback.

3
Chad Ruppert

L'infrastructure MVC ne prend pas en charge la publication classique et l'état d'affichage utilisés dans les formulaires Web. Donc, non, vous n'avez pas accès à IsPostBack.

Je vous conseille d’avoir deux branches: l’une avec le site actuel où vous ajoutez des correctifs pour les erreurs connues et l’autre où vous créez un nouveau site à partir de zéro. Les nouvelles fonctionnalités devraient être implémentées dans celui-ci. Je suppose que la majeure partie de votre base de code est réutilisable dans le nouveau site.

Lorsque le nouveau site est prêt, mettez-le en production.

0
rguerreiro

Pourquoi essayez-vous d'obtenir cette valeur à partir d'un contrôleur? Vous ne savez pas si cela vous aidera, mais vous pouvez toujours utiliser l'objet traditionnel Request pour obtenir des informations soumises par un formulaire ...

0
Luis Abreu

Je ne suis pas sûr d'avoir bien compris votre question, mais sur le contrôleur, vous aurez une action qui gère le GET initial à partir du navigateur et une deuxième action permettant de gérer les POST.

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

 public ActionResult Create()
 {...}
0
Nate

Pour Asp.net Core 2.x, vous pouvez créer une méthode d’extension sur HttpRequest . Basé sur @ibirite, la réponse pourrait ressembler à ceci:

using System;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;

namespace MyApp
{
    public static class HttpRequestExtensions
    {
        public static bool IsPostBack(this HttpRequest request)
        {
            var currentUrl = UriHelper.BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
            var referrer = request.Headers["Referer"].FirstOrDefault();

            bool isPost = string.Compare(request.Method, "POST",
               StringComparison.CurrentCultureIgnoreCase) == 0;
            if (referrer == null) return false;

            bool isSameUrl = string.Compare(currentUrl,
               referrer,
               StringComparison.CurrentCultureIgnoreCase) == 0;

            return isPost && isSameUrl;
        }
    }
}

0
acromm

Si vous avez plusieurs formulaires dans une page MVC, vous pouvez ajouter une entrée masquée dans le formulaire avec un ID significatif et tester si elle a une valeur. De cette façon, vous n'avez pas besoin de deux gestionnaires distincts (un pour get et un pour post).

Donc, inf la page et à l'intérieur du formulaire:

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

Et dans le contrôleur:

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

J'espère que ça aide!

Je voudrais certainement jeter un coup d'oeil à ce billet de Scott Hanselman où il met une page aspx dans une application MVC.

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

Vos contrôleurs n'auront pas accès à la propriété ViewState. Même si vous vouliez gérer le problème de __VIEWSTATE, vous auriez du travail à faire pour le rendre utilisable dans un contrôleur mvc. Bonne chance pour proposer une stratégie de conversion, peu importe la façon dont cela fonctionne, beaucoup de personnes seraient intéressées par le type de problèmes que vous rencontreriez au cours du processus.

0
Min