2013-03-07 4 views
1

я должен реализовать метод, который я объявленный как это:В MVC3 как получить объект, связанный с DataContract, который был отправлен в мои действия?

[OperationContract] 
[WebInvoke(Method = "POST", UriTemplate = @"whatever")] 
void MyMethod(InputContainer input); 

где InputContainer объявлен как DataContract:

[DataContract(Namespace = "whatever")] 
public class InputContainer : IExtensibleDataObject 
{ 
    //[DataMember]s inside 
} 

Сейчас в моем коде у меня есть действие, к которому вызов будет сопоставляются:

[HttpPost] 
ActionResult MyMethod() 
{ 
    // How do I get the InputContainer object here? 
} 

Я видел только образцы с использованием ReadAsAsync(), который является зависимость от еще одной сборки который я бы хотел избежать. В любом случае, я подозреваю, что ReadAsAsync() - это вспомогательный метод, который я мог бы реплицировать.

Как получить DataContract-активированный объект POST ed для моего действия MVC3?

+0

Я не понимаю, у вас есть некоторое ограничение, которое предотвращает вас принять этот объект размещен в качестве аргумента в «MyMethod»? –

+0

@GoranObradovic: Не уверен. Что произойдет, если запрос поступит без данных? – sharptooth

+0

Тогда, если вы добавите параметр InputContainer в качестве аргумента, оно будет иметь нулевое значение, если это пустой запрос POST. –

ответ

0

Это не сработает. Если я добавлю параметр типа InputContainer к моему действию - он будет инициализирован по умолчанию, значения в теле POST будут проигнорированы.

Дополнительная проводка from here не требуется. Сначала требуется реализация IModelBinder, которая будет обращаться к HTTP-запросу InputStream и десериализировать объект с помощью DataContractSerializer. Затем необходим подкласс CustomModelBinderAttribute, который бы возвратил вышеупомянутые реализации IModelBinder с его реализацией GetBinder(). Давайте притворимся, что это называется MagicAttribute. После того, как все это делается всё необходимое добавляет атрибут к параметру:

[HttpPost] 
ActionResult MyMethod([Magic] InputContainer input) 
{ 
} 
+0

Вы отправили xml в тело запроса? –

+0

@GoranObradovic: Да, но я использовал интерфейс '[ServiceContract]' -attributed для составления и отправки запроса. – sharptooth

+0

Да, но вы забыли упомянуть, что тело запроса составлено из xml, поэтому я предложил использовать по умолчанию связующее :) Я думаю, вам следует обновить заголовок вопроса, чтобы упомянуть об этом, просто чтобы помочь другим с той же проблемой. –