Для каждого метода контроллера разрешена только одна публичная подпись. Если вы попытаетесь перегрузить его, он скомпилируется, но вы получите ошибку времени выполнения, с которой столкнулись.
Если вы не желаете использовать разные глаголы (например, атрибуты [HttpGet]
и [HttpPost]
) для дифференциации перегруженных методов (которые будут работать) или изменения маршрутизации, то остается только предоставить другой метод с другим именем, или вы можете отправить внутри существующего метода. Вот как я это сделал:
Однажды я попал в ситуацию, когда мне пришлось поддерживать обратную совместимость. Первоначальный метод предполагал два параметра, а новый - только один. Перегрузка, как я ожидал, не сработала, потому что MVC больше не находил точку входа.
Чтобы решить эту проблему, я сделал следующее:
- Изменены 2 перегруженных метода действия с открытого на приватное
Создан один новый публичный метод, который содержит «всего» 2 строковых параметра. Тот, кто действовал как диспетчер, т.е.
public ActionResult DoSomething(string param1, string param2)
{
if (string.IsNullOrEmpty(param2))
{
return DoSomething(ProductName: param1);
}
else
{
int oldId = int.Parse(param1);
return DoSomething(OldParam: param1, OldId: oldId);
}
}
private ActionResult DoSomething(string OldParam, int OldId)
{
// some code here
return Json(result);
}
private ActionResult DoSomething(string ProductName)
{
// some code here
return Json(result);
}
Конечно, это взлом, и его следует изменить позже. Но пока это работает для меня.
Вы также можете создать диспетчер, например:
public ActionResult DoSomething(string action, string param1, string param2)
{
switch (action)
{
case "update":
return UpdateAction(param1, param2);
case "remove":
return DeleteAction(param1);
}
}
Вы можете видеть, что для UpdateAction нужны 2 параметра, а для DeleteAction - один.