在我的网站上,我想在所有页面上显示一个登录框。所以我想制作一个局部视图页面,我在共享的_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>
查看问题?
答案 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
视图引擎而不是剃刀。