ASP.NET MVC: указать поставщика значения для каждого действия или для каждого маршрута? - PullRequest
4 голосов
/ 17 июня 2011

Я пытаюсь настроить действие в ASP.NET MVC 3 для обработки полезной нагрузки запроса mercurial webhook - в данном случае, сгенерированного Kiln .

Полезная нагрузка - JSON, но, к сожалению, она отправляется в виде значения формы в кодировке URL с типом содержимого application/x-www-form-urlencoded, потому что, очевидно, использование application/json и отправка его без кодировки без имени параметра сделало бы его слишком простым и ... . стандарт.

Это означает, что я не могу просто использовать новый JsonValueProviderFactory, потому что он только принимает запросы, используя стандартный тип контента application/json. И, конечно, я не могу просто заставить фабрику также получать application/x-www-form-urlencoded запросов, потому что мне нужны эти запросы, чтобы использовать поставщик значений данных формы везде в моем приложении, которое фактически получает данные формы, а не JSON.

Итак, есть ли способ указать, что ValueProvider или ValueProviderFactory должны использоваться только для определенного действия или маршрута?

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

Если вы создаете конкретный контроллер для обработки этих запросов веб-крючка, вы можете назначить свой уникальный ValueProvider при создании экземпляра вашего контроллера.

public class KilnController : Controller
{

    public KilnController()
    {
        this.ValueProvider = MyCustomValueProvider;
    }

    ...
}

Это должно удовлетворить вашу потребность в пользовательском ValueProvider для этих запросов.

1 голос
/ 17 июня 2011

Оказывается, что IValueProvider не был конкретным битом расширяемости, который я искал - мне просто нужно было использовать быструю реализацию IModelBinder, которую я нашел благодаря Джеймсу Хьюзу . Нужно было немного подправить, чтобы скрыть что-то из формы:

public class JsonFormModelBinder : IModelBinder
{
    #region [ ModelBinder Members ]

    Object IModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        HttpRequestBase request = controllerContext.HttpContext.Request;
        var jsonStringData = request.Form[bindingContext.ModelName];
        if (jsonStringData != null) return JsonConvert.DeserializeObject(jsonStringData, bindingContext.ModelType);
        else return null;
    }

    #endregion
}

И использование:

    [HttpPost]        
    public ActionResult WebHook([ModelBinder(typeof(JsonFormModelBinder))] WebHookMessage payload)
    {
        return Content("OK");
    }
...