Android разница между testImplementation и androidTestImplementation в build.gradle

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

Если вы не хотите использовать разные глаголы (например, атрибуты [HttpGet] и [HttpPost]), чтобы различать перегруженные методы (которые будут работать) или изменять маршрутизацию, тогда остается то, что вы может либо предоставить другой метод с другим именем, либо вы можете отправить внутри существующего метода. Вот как я это сделал:

Однажды я пришел в ситуацию, когда мне пришлось поддерживать обратную совместимость. Первоначальный метод ожидал два параметра, но новый имел только один. Перегрузка, как я ожидала, не сработала, потому что MVC больше не нашел точку входа.

Чтобы решить эту проблему, я сделал следующее:

  1. Изменено 2 перегруженных метода действия из public в private
  2. Создан один новый общедоступный метод, который содержал «just» 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 просто требуется один.

22
задан srb1991 29 August 2018 в 11:50
поделиться