2015-09-03 21 views
17

Stworzyłem niestandardowy segregator modelu MVC, który jest wywoływany dla każdego HttpPost dostarczanego do serwera. Ale nie jest wywoływany dla żądań HttpGet.Niestandardowy segregator dla ASP.NET MVC na żądanie GET

  • Gdyby mój zwyczaj modelu spoiwo sprawdzony podczas GET? Jeśli tak, to za czym tęskniłem?
  • Jeśli nie, w jaki sposób mogę napisać niestandardowy kod obsługujący QueryString z żądania GET?

Oto moja realizacja ...

public class CustomModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     // This only gets called for POST requests. But I need this code for GET requests. 
    } 
} 

Global.asax

protected void Application_Start() 
{ 
    ModelBinders.Binders.DefaultBinder = new CustomModelBinder(); 
    //... 
} 

szukałem do tych rozwiązań, ale nie dość pracy za co jestem poszukuje:

  • Trwałe typy złożone przez TempData
  • Korzystanie domyślny spoiwo do budowania złożonych typów (?Name=John&Surname=Doe)

uwaga na odpowiedź

Dzięki @Felipe za pomoc. Na wszelki wypadek, gdyby ktoś zmaga się z tym samym, ja nauczyłem:

  • Zwyczaj modelu spoiwo CAN być wykorzystywane do GET wniosków
  • Ty CAN użycie DefaultModelBinder klasa
  • Mój szkopuł, że akcja metoda MUSI mieć parametr (w przeciwnym razie moduł pomijania modelu zostanie pominięty dla żądań GET, co ma sens, gdy się nad tym zastanowić)
+0

można wykorzystać [OnActionExecuting] (https://msdn.microsoft .com/en-us/library/dd493080% 28v = vs.98% 29.aspx) w celu filtrowania każdego żądania iw tej metodzie można uzyskać ciąg zapytania za pomocą 'Request'. –

+0

@JSantosh, załóżmy, że to zrobiłem i zdobyłem 'QueryString' w' OnActionExecuting'. Nie byłabym w stanie przetłumaczyć QueryString na obiekt i przekazać go jako parametr do metody akcji, prawda? Co pozostawia mnie w tym samym położeniu. –

+0

W żądaniu pocztowym otrzymujesz dane jako obiekt, który jest automatycznie analizowany w odpowiednim modelu, ale w przypadku uzyskania danych w postaci ciągu znaków, nie jestem pewien, czy możesz to osiągnąć. i dobre pytanie :) –

Odpowiedz

18

Załóżmy, że masz swój własny typ, który chcesz związać.

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    // other properties you need 
} 

Można tworzyć niestandardowe modelu wiązania dla tego konkretnego typu, inherithing od DefaultModelBinder, dla próbki:

public class PersonModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var request = controllerContext.HttpContext.Request; 

     int id = Convert.ToInt32(request.QueryString["id"]); 
     string name = request.QueryString["name"]; 
     int age = Convert.ToInt32(request.QueryString["age"]); 
     // other properties 

     return new Person { Id = id, Name = name, Age = age }; 
    } 
} 

W Global.asax w przypadku Application_Start można rejestru tego modelu wiązania, dla próbki:

// for Person type, bind with the PersonModelBinder 
ModelBinders.Binders.Add(typeof(Person), new PersonModelBinder()); 

w metodzie z PersonModelBinderBindModel, upewnij się, że wszystkie parametry w ciągu kwerendy d dać im idealne leczenie.

Skoro masz ten sposób działanie:

public ActionResult Test(Person person) 
{ 
    // process... 
} 

Możesz uzyskać dostęp do tego działania z czymś url jak poniżej:

Test?id=7&name=Niels&age=25 
+0

Dzięki za szczegółową odpowiedź. Używam 'DefaultModelBinder' (zobacz moje pytanie) i nie wydaje się być trafiony podczas żądania ** GET **, tylko dla ** POST **. Czy twoja metoda 'BindModel' jest również wywoływana dla' HttpGet'? –

+0

Testowałem tutaj iw metodzie 'Test' mam parametr' person' wypełniony. Upewnij się, że zarejestrowałeś niestandardowe powiązanie dla niestandardowego typu. Pamiętaj, że musisz również przeczytać z 'request.QueryString'. –

+0

Fantastycznie, a potem straciłem coś po mojej stronie. Pozwól mi się pobawić i wrócić do ciebie. Dzięki. –