2016-01-05 3 views
2

У меня есть несколько классов моделей, унаследованных от общей базы (например, Class1, Class2 наследуется от CommonClass). Я хотел бы написать отдельное перегруженное действие контроллера, которое будет иметь каждый из этих классов моделей в качестве параметра. Например:Действие перегрузки с различными параметрами

[HttpPost] 
    public JsonResult MyAction(Class1 data) 
    { 
     // handle data here 
    } 

    [HttpPost] 
    public JsonResult MyAction(Class2 data) 
    { 
     // handle data here 
    } 

Как это можно достичь? Когда я пытаюсь просто написать эти методы действий, MVC выбрасывает System.Reflection.AmbiguousMatchException.

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

[HttpPost] 
    public JsonResult MyAction(CommonClass data) 
    { 
     if(data.IsSomething) 
     { 
      var castedData = data as Class1; 
      // process casted data 
     } 
     else 
     { 
      var castedData = data as Class2; 
      // process casted data 
     } 
    } 

ответ

3

У вас не может быть несколько действий с тем же именем и HTTP-глаголом на одном контроллере. Вам понадобятся разные имена и маршруты действий.

В качестве альтернативы вы можете сделать заказ this answer, в котором я иллюстрирую, как вы можете написать настраиваемое связующее устройство и добиться полиморфного связывания (ваша вторая попытка с базовым классом).

1

Вы можете украсить свое действие аннотацией [ActionName]. Как это:

[HttpPost, ActionName("OtherName")] 
public JsonResult MyAction(Class1 data) 
{ 
    // handle data here 
} 

[HttpPost] 
public JsonResult MyAction(Class2 data) 
{ 
    // handle data here 
} 

И с этим вы можете использовать, чтобы поместить имена с символами, которые .NET не позволяют, как [ActionName("This-Example")]