Частичный вид MVC3 внутри мастер-страницы

На моем сайте я хочу отображать поле входа на всех страницах. Поэтому я хотел создать страницу частичного просмотра, которую я использую в своем файле _Layout.cshtml в Shared.

Но куда пойдет контроллер для этого частичного представления? И как моя кнопка входа будет иметь к ней доступ?

Таким образом, когда Request.IsAuthenticated имеет значение true, в поле входа отображается «Вошел в систему как ...», но когда результат неверен, я получаю небольшую таблицу с обычной формой имени пользователя/пароля.

Редактировать: после того, как я попробовал несколько ответов ниже, я, кажется, застрял в бесконечном лоппе в методе GET ниже. Это потому, что мой частичный вид пытается загрузить мне файл _Layout.cshtml, так как он хочет связать «мастер-страницу» с частичным видом? И поскольку мое частичное представление отображается в _Layout.cshtml, оно обрывается?

public class LoginController : Controller
{
    //
    // GET: /Login/

    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(LoginModel loginModel)
    {
        if(ModelState.IsValid)
        {
            var g = new GallaryImage();
            var user = g.LoginUser(loginModel.Username, loginModel.Password);
            if(user != null) 
            {
                FormsAuthentication.SetAuthCookie(user.username, false);
                return RedirectToAction("index", "Home");
            }
            ModelState.AddModelError("", "Invalid Username/Password");
        }
        return View();
    }

В моем _Layout.cshtml я пытаюсь загрузить частичное представление следующим образом:

<div style="text-align: right">
      @Html.Action("Index", "Login")
</div>

Видите проблему?


person Craig    schedule 07.01.2012    source источник


Ответы (3)


К вашему сведению, представления не имеют контроллеров. Контроллеры имеют представления. Различие может показаться тонким, но это не так. Представление может использоваться любым количеством контроллеров, а представления не заботятся о контроллерах и не знают о них. Поэтому вам нужно подумать о текущем URL-адресе, что означает текущий метод действия.

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

Даже имя пользователя можно отобразить в свойстве User страницы.

Просто взгляните на приложение MVC по умолчанию, которое создается при создании нового интернет-проекта. В нем уже реализован весь этот функционал. Просто скопируйте его.

person Erik Funkenbusch    schedule 07.01.2012
comment
Спасибо - я посмотрел проект по умолчанию. Экран входа в систему - это просто ссылки - я пытаюсь встроить всю форму входа в систему на главной странице _Layout, и если он вошел в систему, просто покажите «Добро пожаловать, имя пользователя». - person Craig; 08.01.2012
comment
@Craig - это работает так же, вы просто помещаете свою форму в свой блок if. Это очень просто. - person Erik Funkenbusch; 08.01.2012
comment
Спасибо. Должен ли частичный вид находиться в общей папке или в папке представлений, если он используется в _Layout ? - person Craig; 08.01.2012

Вы можете указать имя контроллера в качестве атрибута для метода Html.Action

Html.Action("ActionName", "ControllerName")

Если вы используете синтаксис Razor, вы должны написать @Html.Action("ActionName", "ControllerName") в своем представлении, а ваше действие с именем ActionName должно возвращать PartialView (который будет вашей областью входа).

person Chuck Norris    schedule 07.01.2012
comment
Будет ли это в контроллере? - person Craig; 07.01.2012
comment
Спасибо - я попробовал это, и теперь я застрял в бесконечном цикле в моем методе индекса частичного просмотра. - person Craig; 07.01.2012
comment
Что означает метод индекса частичного представления? - person Chuck Norris; 07.01.2012
comment
Убедитесь, что вы пишете Layout=null в своем индексном представлении контроллера входа, иначе, конечно, это будет бесконечный цикл. - person Chuck Norris; 08.01.2012
comment
Вы должны каким-то образом изменить это представление, поэтому я рекомендую вам сделать ваше поле входа в систему View PartialView без какого-либо макета. - person Chuck Norris; 08.01.2012

Попробуйте использовать HTML.RenderAction("Action", "Controller") и убедитесь, что вы не вызываете главную страницу из частичного представления. Это может создать петлю.

Я использую движок просмотра MVC 3 ASPX, а не бритву.

person MMUrray    schedule 05.03.2012