【问题标题】:MVC3 Partial view inside Master Page母版页内的 MVC3 部分视图
【发布时间】:2012-01-07 08:52:52
【问题描述】:

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

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

所以,当 Request.IsAuthenticated 为真时,登录框会显示“登录为 ...”,但当结果为假时,我会得到一个带有通常用户名/密码表单的小表格。

编辑:在尝试了下面的一些答案之后,我似乎在下面的 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>

看到问题了吗?

【问题讨论】:

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


    【解决方案1】:

    仅供参考,视图没有控制器。控制器有视图。这种区别可能看起来很微妙,但事实并非如此。一个视图可以被任意数量的控制器使用,并且视图不关心或知道控制器。所以你要考虑当前的URL,也就是当前的Action Method。

    在您的部分登录的情况下,它不需要来自控制器的任何东西。它直接访问页面的 User 属性以查明它是否已通过身份验证。您的登录按钮只是一个表单,其操作方法设置为您的帐户控制器的登录方法。

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

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

    【讨论】:

    • 谢谢 - 我查看了默认项目。登录屏幕只是链接-我正在尝试将其自身的整个登录表单嵌入到_Layout“母版页”中,如果他已登录,只需显示“欢迎,用户名”。
    • @Craig - 它的工作方式相同,您只需将表单放入 if 块中。这非常简单。
    • 谢谢 - 如果部分视图在 _Layout 中使用,应该在共享文件夹中还是在视图文件夹中?
    【解决方案2】:

    您可以将控制器名称作为属性赋予Html.Action 方法

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

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

    【讨论】:

    • 这会在控制器中吗?
    • 谢谢 - 我已经尝试过了,现在我的部分视图索引方法陷入了无限循环。
    • 什么是“局部视图索引法”?
    • 一定要在Login Controller的Index视图中写上Layout=null,否则当然会死循环。
    • 您必须以某种方式在该视图中有所作为,所以我会建议您在没有任何布局的情况下制作您的登录框视图 PartialView。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多