2010-03-23 3 views
1

Si j'ai une action de contrôleur qui peut recevoir à la fois HTTP GET et HTTP POST provenant d'un certain nombre de sources différentes, chaque source envoyant des données différentes, par ex.Liaison de modèle ASP.NET MVC

  1. Source1 effectue une forme POST avec deux éléments de formulaire Item1 et Item2
  2. Source2 effectue un GET où les données sont contenues dans la chaîne de requête (? ItemX = 2 & ItemY = 3)

Est-il possible d'avoir une action de contrôleur qui répondra à tous ces cas et effectuer automatiquement la liaison par exemple public Test ActionResult (données du dictionnaire) { // Fonctionne ... return View(); Est-ce possible avec un classeur personnalisé ou d'une autre manière? ne veulent pas travailler directement avec HttpContext.Request si possible

Répondre

0

Cette solution fonctionne, pas le meilleur pour les tests unitaires

 public object BindModel(
        ControllerContext controllerContext, 
        ModelBindingContext bindingContext) 
       { 
        TestIBE.Models.IBERequest _IBERequest; 
        HttpContextBase _httpContext; 
        Dictionary<string, string> _requestData; 


        _httpContext = controllerContext.HttpContext; 
        _requestData = this.CreateRequestData(_httpContext.Request); 

        _IBERequest = new TestIBE.Models.IBERequest(
         _httpContext.Session.SessionID, 
         _httpContext.Request.UserHostAddress, 
         _httpContext.Request.UserAgent, 
         _httpContext.Request.Url, 
         _requestData); 

        return _IBERequest; 
       } 


       private Dictionary<string, string> CreateRequestData(
        HttpRequestBase subject) 
       { 
        Dictionary<string, string> _result; 


        _result = new Dictionary<string, string>(); 
        subject.Form.AllKeys.ForEach(key => _result.Add(key, subject.Form[key])); 
        subject.QueryString.AllKeys.ForEach(key => { if (!_result.ContainsKey(key)) { _result.Add(key, subject.QueryString[key]); } }); 

        return _result; 
       } 


public class IBEController : Controller 
    { 
     public ActionResult Landing(
      [ModelBinder(typeof(TestIBE.Helpers.Binders.IBEModelBinder))] TestIBE.Models.IBERequest IBERequest) 
     { 
      // TODO 
      return View(); 
     } 
    } 
1

Le schéma habituel est d'avoir deux méthodes de contrôleur Une méthode contrôleur gère l'EEG, l'autre méthode du contrôleur gère le POST:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult MyControllerMethod(string itemX, string itemY) 
{ 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult MyControllerMethod(MyViewDataObject data) 
{ 
} 

Si vous avez besoin aider les listes de liaison, des collections ou des dictionnaires, vous pouvez le trouver here.

+0

++ L'idée est que l'affichage d'une page et la gestion des entrées sont des actions très distinctes et ne doit pas être combiné. –

+0

Robert merci pour la réponse Je n'ai peut-être pas été clair dans ma question. Je veux que la capacité d'avoir une action de contrôleur reçoive les HTTP GETS et POSTS car ceux-ci proviendront de tierces parties. Ces tiers enverront également des données totalement différentes, donc je ne peux pas faire de liaison fortement typée à un objet comme vous le suggérez (MyViewDataObject). C'est pourquoi j'ai demandé s'il est possible de lier un dictionnaire. Savez-vous si c'est possible? – Noel

+0

Je ne peux pas penser à * tout * scénario où vous seriez obligé de gérer le GET et POST dans la même méthode. Il y a un lien dans ma réponse qui montre comment lier des listes, mais si vous acceptez un objet simple dans la méthode du contrôleur, vous devrez probablement le lier vous-même; les classeurs de données MVC ne le feront pas automatiquement à moins que vous ne puissiez le taper fortement. –

Questions connexes