Vraag Custom Model Binder voor ASP.NET MVC op GET-verzoek


Ik heb een aangepaste MVC Model Binder gemaakt die voor elke persoon wordt opgeroepen HttpPost dat komt op de server. Maar wordt niet opgeroepen HttpGet verzoeken.

  • Moet mijn aangepaste modelmap worden aangeroepen tijdens een GET? Zo ja, wat heb ik gemist?
  • Zo nee, hoe kan ik aangepaste code schrijven voor de verwerking van de QueryString van een GET Verzoek?

Dit is mijn implementatie ...

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();
   //...
}

Ik heb deze oplossingen bekeken, maar ze werken niet helemaal waar ik naar op zoek ben:

  • Aanhoudende complexe typen via TempData
  • Het standaard binder gebruiken om complexe types op te bouwen (?Name=John&Surname=Doe)

Opmerking over antwoord

Bedankt aan @Felipe voor de hulp. Voor het geval dat iemand met hetzelfde worstelt, heb ik geleerd:

  • Het bindmiddel voor het aangepaste model KAN wordt gebruikt voor GET verzoeken
  • U KAN gebruik DefaultModelBinder klasse
  • Mijn probleem was dat het actiemethode MOET een parameter hebben (anders wordt het modelbindmiddel overgeslagen GET Verzoeken, wat logisch is als je erover nadenkt)

17
2017-09-03 10:54


oorsprong


antwoorden:


Laten we aannemen dat je je eigen type hebt dat je wilt binden.

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

U kunt een aangepaste modelbinding voor dit specifieke type maken, waarbij wordt overgenomen van DefaultModelBinder, voor voorbeeld:

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 };
    }
}

In de Global.asax in de Application_Start gebeurtenis, u kunt dit register binden voor voorbeeld:

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

In de BindModel methode van de PersonModelBinder, zorg ervoor dat u alle parameters in de querystring hebt en geef ze de ideale behandeling.

Omdat je deze actiemethode hebt:

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

Je hebt toegang tot deze actie met een URL als volgt:

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

18
2017-09-03 11:36