Логика маршрутизации / контроллера MVC 4 - что-то базовое идет не так

У меня это работало вчера, и я совершенно не понимаю, почему он перестал работать. У меня следующий базовый сценарий:

В моем заявлении есть два типа ролей: Арендатор и Арендодатель. Когда Арендатор входит в систему, он должен быть направлен на страницу профиля Арендатора, то же самое касается Арендодателя (на данный момент я работаю только с Арендаторами).

Вот рабочий процесс сценария:

  1. Пользователь входит в систему через _LoginPartial, я уверен, что логика в партиале верна, но по какой-то причине ТАК не позволяет мне правильно вставить сюда код бритвы ...

  2. Нажатие кнопки входа вызывает Login ActionResult в AccountController. Этот метод проверяет пользователя и проверяет, в какой роли он находится. Если пользователь находится в роли Tenant, он должен быть перенаправлен на MyProfile ActionResult в TenantsController. Код для Login:

    public ActionResult Login(LoginModel model)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
            if (Roles.IsUserInRole("Tenant"))
            {
                return RedirectToAction("MyProfile", "Tenants");
            }
        }
    
        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }
    
  3. После вызова MyProfile должен отобразить профиль пользователя. Код для MyProfile ActionResult:

    public ActionResult MyProfile()
    {
        var db = new LetLordContext();
        var currentTenant = db.UserProfile.First(t => t.UserName == HttpContext.User.Identity.Name);
    
        return View(currentTenant);
    }
    

Как я уже сказал, вчера это работало, но при нажатии кнопки входа на _RegisterPartial появляется следующая ошибка:

Представление «Логин» или его главное устройство не было найдено, либо механизм представления не поддерживает найденные местоположения. Был произведен поиск в следующих местах: ~ / Views / Account / Login.aspx ~ / Views / Account / Login.ascx ~ / Views / Shared / Login.aspx ~ / Views / Shared / Login.ascx ~ / Views / Account / Login. cshtml ~ / Views / Account / Login.vbhtml ~ / Views / Shared / Login.cshtml ~ / Views / Shared / Login.vbhtml

Почему MVC ищет представление под названием Login? Я не указал его для перехода к представлению с именем Login. Что-то не так с моей логикой маршрутизации / контроллера? Помощь будет очень признательна.


person MattSull    schedule 28.02.2013    source источник
comment
Вы отлаживали код до этой строки? ..... return RedirectToAction (MyProfile, Tenants);   -  person K D    schedule 28.02.2013
comment
«Если» не удовлетворяется, когда я отлаживаю, кажется, что по какой-то причине ролей там нет - они были вчера.   -  person MattSull    schedule 28.02.2013
comment
да, именно поэтому я предоставил вам код в своем ответе, чтобы проверить, удовлетворяет ли он, если или нет :) Спасибо   -  person K D    schedule 28.02.2013


Ответы (5)


Потому что эти строки выполняются:

// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);

По-видимому, либо попытка входа в систему не удалась, либо ввод был недопустимым. Теперь выполняется последний возврат действия Login. Поскольку вы не указали имя представления напрямую, соглашение об именах пытается найти представление с тем же именем, что и действие (в данном случае Login). Попробуйте явно указать имя представления:

return View("ViewName", model);
person Andrei    schedule 28.02.2013
comment
Учетные данные для входа определенно действительны. Теперь я понимаю, почему я получаю эту ошибку, спасибо. Видите ли вы что-нибудь неправильное в том, что я пытаюсь сделать до ошибки, учитывая, что я знаю правильные учетные данные для входа? - person MattSull; 28.02.2013
comment
@ MattSull87, могут быть изменения с ролями? Если условие в if по какой-либо причине не выполняется (например, зарегистрированный пользователь не является арендатором), перенаправление также не произойдет. - person Andrei; 28.02.2013
comment
Я думаю, что это тоже должно быть так - я отладил, и когда доходит до «если», я не вижу ролей, которые я определил ... Я изучу это подробнее, спасибо. - person MattSull; 28.02.2013

Ваше Login действие AccountsController возвращает View(model).

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

person Srikanth Venugopalan    schedule 28.02.2013
comment
Спасибо, я понимаю, почему получаю эту ошибку. Видите ли вы что-нибудь еще не так с моей логикой, учитывая, что я знаю правильные учетные данные для входа? - person MattSull; 28.02.2013
comment
Поскольку у вас есть _LoginPartial, можете ли вы вернуть это частичное представление с ошибками модели в нем? Правильные учетные данные для входа - это поведение во время выполнения, ошибка, которую вы видите, появится во время компиляции. Кроме того, если ваши учетные данные неверны, вам все равно нужно обработать это. - person Srikanth Venugopalan; 28.02.2013

Выполните следующий трюк и проверьте, печатает ли он «Hello User» в браузере. Если да, то это означает, что он не проверяет пользователя и не перенаправляет его на страницу входа, как указано в нижней части вашего метода.

public ActionResult Login(LoginModel model)
{
    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
    {
        if (Roles.IsUserInRole("Tenant"))
        {
            return RedirectToAction("MyProfile", "Tenants");
        }
    }

    // If we got this far, something failed, redisplay form
    ModelState.AddModelError("", "The user name or password provided is incorrect.");
    return Content("Hello User");
}
person K D    schedule 28.02.2013

Откройте ваш web.config.

Смотри сюда:

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
person Mike C.    schedule 28.02.2013
comment
Не могли бы вы дать мне больше информации о том, чего именно это будет достигать? - person MattSull; 28.02.2013
comment
Извините, надо было объяснить больше. Загляните в свой web.config и убедитесь, что он не указывает на View в этом месте. У меня такое случалось однажды, и в этом была проблема. Единственное, что нужно подтвердить, - это указать правильное место. Или, возможно, я неправильно понял проблему. - person Mike C.; 28.02.2013

Проблема была вызвана использованием этого ...

if (Roles.IsUserInRole("Tenant"))

...вместо этого:

if (Roles.IsUserInRole(model.UserName, "Tenant"))

Первый может быть вызван после того, как пользователь вошел в систему. Кажется, что последний должен использоваться при вызове внутри Login - может иметь какое-то отношение к тому, что пользователь не находится в сеансе / полностью вошел в систему и т. Д.

Все равно работает.

person MattSull    schedule 28.02.2013