Как остановить возврат метода к вызывающему методу

#asp.net-mvc

#asp.net-mvc

Вопрос:

Я новичок в MVC и не могу найти ответ на свою проблему, надеюсь, кто-нибудь сможет помочь. У меня есть 2 метода, оба являются actionresults и оба возвращают представления. Проблема, с которой я сталкиваюсь, заключается в том, что первый метод вызывает второй метод, который создает viewmodel и присваивает найденные данные модели представления, а затем возвращает представление. Но проблема, с которой я сталкиваюсь, заключается в том, что второй метод возвращается к первому методу, и вместо представления второго метода отображается представление первого метода. Мой вопрос в том, как мне остановить возврат второго метода к первому методу и выполнить представление из второго метода. Надеюсь, я прояснил это. Спасибо, вот мой код.

первый метод

         [Route("confirmuser")]
    public ActionResult ConfirmUser()
    {
        var cacId = Request.ClientCertificate["SubjectCN"];
        var validUser = LocateUser(cacId);
        switch (validUser)
        {
            case "ActiveUser":
                return RedirectToAction("Index", "ActiveUser");
            case "MultipleUserTypes":
                MultipleUserType();
                break;
            case "Inactive":
                return View(AccountMessage(validUser));
            case "Locked":
                return View(AccountMessage(validUser));
            case "Disabled":
                return View(AccountMessage(validUser));
            case "New":
                break;
            case "UserNotFound":
                return View(AccountMessage(validUser));
        } //end switch
        return View();
    }
  

второй метод

     [Route("multipleusertype")]
    public ActionResult MultipleUserType()
    {
        var user = (UserInfo)Session["user"];

        var usertype = GetAllUserTypes(user.Id);
        var multipleUserType = new ActiveUserViewModel();

        multipleUserType.UserTypes = usertype;

        return View(multipleUserType);
    }
  

Комментарии:

1. Если вам нужен какой-то код из другого метода, тогда возьмите только этот код и создайте новый метод, который возвращает что-то более универсальное, что вы можете использовать. В качестве примера в другом методе вы могли бы поместить оператор switch и вернуть только AccountMessage и использовать его где угодно.

2. I hope I made this clear не совсем. Скорее всего, вы путаете функции в целом и действия. Метод всегда возвращается к своему вызывающему. return View(multipleUserType) также ничего не отправляет в средство визуализации. Это промежуточное программное обеспечение, которое в первую очередь вызвало действие, которое получит это ActionResult и отобразит его в HTML. В этом случае, похоже, все, что вам нужно, это, return MultipleUserType(); хотя гораздо лучшим решением было бы извлечь код, который генерирует multipleUserType , в отдельный метод и вызвать его.

3. Действие указывает маршрут, выполняет проверки, возвращает экземпляры ActionResult и т.д. Если вы пытаетесь использовать одно действие внутри другого, вы в конечном итоге применяете проверки одного действия к другому, что почти всегда не то, что вы хотели. Изменить первое действие тоже намного сложнее, поскольку это рискует привести к поломке вызывающего его объекта. Вместо повторного использования кода вы в конечном итоге объединили два действия вместе

4. Вот простое эмпирическое правило: если вы обнаружите, что вызываете один метод действия из другого метода действия, то ваша структура кода неверна. Метод действия должен вызываться только в ответ на действие, предпринятое пользователем в браузере — думайте о методах действия как об интерфейсе вашего приложения к внешнему миру. Следовательно, они не являются чем-то, что можно использовать внутренне, поэтому вам не следует вызывать их непосредственно из вашего C #-кода.

5. Скорее всего, вам нужен третий (обычный, не требующий действий) метод, который возвращает интересующие вас данные, которые могут совместно использоваться обоими методами действия. Либо это, либо ваш первый метод действия должен перенаправлять браузер на второй

Ответ №1:

Попробуйте добавить return ключевое слово :

 case "MultipleUserTypes":
            return  MultipleUserType();
  

Как кто-то прокомментировал, это быстрое исправление, и методы общедоступных действий не предназначены для вызова подобным образом. Вам действительно следует провести рефакторинг до частного метода, инкапсулирующего общую логику.

Комментарии:

1. Это быстрое решение, но не решит реальную проблему — использование одного действия внутри другого

2. Вы полностью правы, это вообще не рекомендуется. Но это действительно отвечает на вопрос, я думаю.