2015-11-12 2 views
1

Возможно ли, что у меня может быть ActionResult/JsonResult, который может принимать общий тип параметра? то есть я хочу сделать что-то вроде этого:Создать метод действия на контроллере с открытым общим типом

public class mycontroller : Controller 
{ 
    public async Task<JsonResult> Add(T type) 
    { 

    } 
} 

где T может быть любой класс, который я определил в моей модели. Любые мысли по этому поводу?

ответ

4

Нет, это невозможно. Чтобы вызвать действие, основанное на теле запроса, есть то, что упоминается как modelbinder, который определяет, как данные в запросе должны быть сконструированы так, чтобы они соответствовали параметрам метода действия. Без конкретного типа, с которым можно работать, модельный блок не имеет указаний.

UPDATE

Просто объяснить немного лучше. Обычно, когда вы имеете дело с дженериками, вы должны явно указывать тип (используя синтаксис <Type> при вызове метода) или неявно (передавая в экземпляре что-то для общего параметра, вы говорите, что общий тип - это тип этот экземпляр).

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

+0

Я редактировал вопрос, чтобы удалить путаницу – Aqdas

+3

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

2

Взаимодействию модели MVC необходимо сопоставить входящие поля формы (или данные JSON или XML или что-то еще) в свойствах по типу параметров вашего метода.

Другими словами, для входящего { "foo" : "bar" } требуется Bar в public async Task<JsonResult> Add(Bar bar), чтобы иметь foo.

WebAPI не знает, какие типы имеют свойство foo. Да, он мог сканировать все сборки в каталоге bin и находить «наиболее подходящий» тип, но с учетом примера JSON выше и двух классов с свойством foo, что является «наиболее подходящим» и почему?

Вы не можете ответить на этот вопрос и не хотите, чтобы команда MVC не захотела, поэтому нет, ваши методы контроллера WebAPI/MVC должны работать с конкретными типами параметров.

+0

Я редактировал вопрос, чтобы удалить путаницу – Aqdas

+0

Ваше изменение не аннулирует мой ответ. – CodeCaster

+1

никогда не давайте отрицательный рейтинг любому, кто задает вопрос. задавать вопрос право человека, который не знает. в любом случае спасибо, – Aqdas

Смежные вопросы