MVC3 Master Page内的部分视图

时间:2012-01-07 08:52:53

标签: c# asp.net-mvc asp.net-mvc-3 partial-views login-control

在我的网站上,我想在所有页面上显示一个登录框。所以我想制作一个局部视图页面,我在共享的_Layout.cshtml文件中使用它。

但是这个局部视图的控制器会去哪里?我的“登录”按钮如何访问它?

因此,当Request.IsAuthenticated为true时,登录框显示“Logged in as ...”,但是当结果为false时,我会得到一个包含常用用户名/密码表的小表。

编辑:在尝试下面的一些答案之后,我似乎陷入了下面的GET方法的无休止的lopp。这是因为我的部分视图试图加载我_Layout.cshtml文件,因为它想要与局部视图一起使用'masterpage'?而且因为我的部分视图是在_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>

查看问题?

3 个答案:

答案 0 :(得分:2)

您可以将控制器名称作为属性提供给Html.Action方法

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

如果您使用Razor语法,则必须在视图中编写@Html.Action("ActionName", "ControllerName"),名称为ActionName的操作应返回PartialView(这将是您的登录区域)。

答案 1 :(得分:2)

仅供参考,Views没有控制器。控制器有视图。区别可能看起来很微妙,但事实并非如此。任何数量的控制器都可以使用视图,并且视图不关心或不了解控制器。所以你必须考虑当前的URL,这意味着当前的Action Method。

如果您的登录部分,则控制器中的任何内容都不需要太多。它直接访问页面的User属性以查明它是否经过身份验证。您的登录按钮只是一个表单,其操作方法设置为您帐户控制器的登录方式。

甚至可以从页面的User属性显示用户名。

只需查看创建新Internet项目时生成的默认MVC应用程序。它已经实现了所有这些功能。只需复制它。

答案 2 :(得分:0)

尝试使用HTML.RenderAction("Action", "Controller")并确保您没有在局部视图中调用母版页。这有可能产生一个循环。

我正在使用MVC 3 ASPX视图引擎而不是剃刀。