Подтвердить что ты не робот

Пользовательское связующее устройство для ASP.NET MVC в запросе GET

Я создал пользовательский MVC Model Binder, который вызывается для каждого HttpPost, который приходит на сервер. Но не вызывается для запросов HttpGet.

  • Должно ли мое настраиваемое связующее устройство вызываться во время GET? Если да, то чего я пропустил?
  • Если нет, как написать собственный код обработки QueryString из GET Request?

Здесь моя реализация...

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

Я изучил эти решения, но они не совсем работают для того, что я ищу:

  • Сохранение сложных типов через TempData
  • Использование связующего по умолчанию для создания сложных типов (?Name=John&Surname=Doe)

Замечание о ответе

Спасибо @Felipe за помощь. На всякий случай кто-то борется с этим, я узнал:

  • Для GET запросов используется CAN.
  • Вы CAN используете DefaultModelBinder класс
  • Моя проблема заключалась в том, что метод действия ДОЛЖЕН иметь параметр (в противном случае прошивка модели пропускается для GET запросов, что имеет смысл, когда вы об этом думаете)
4b9b3361

Ответ 1

Предположим, что у вас есть собственный тип, который вы хотите связать.

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

Вы можете создать пользовательскую привязку модели для этого конкретного типа, наследуя от DefaultModelBinder, для образца:

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

В Global.asax в событии Application_Start вы можете связать эту модель с реестром для образца:

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

В методе BindModel из PersonModelBinder убедитесь, что у вас есть все параметры в querystring и дайте им идеальное лечение.

Поскольку у вас есть этот метод действий:

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

Вы можете получить доступ к этому действию с URL-адресом примерно так:

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