我有一个像这样的控制器:
public ActionResult Index()
{
ViewBag.Title = "Index";
ViewBag.LoggedIn = TheUser.CheckStatus();
return View();
}
事情是,我必须将LoggedIn设置为我的其他函数TheUser.CheckStatus()的输出,以便我可以用razor引用它... Razor有没有办法直接访问函数?例如......
@TheUser.CheckStatus
而不是
@ViewBag.LoggedIn
答案 0 :(得分:5)
MVC中用于将信息传递给视图的推荐方法是创建特定于该视图的模型(也称为视图模型),例如。
public class IndexViewModel
{
public string Title { get; set; }
public bool IsAuthenticated { get; set; }
}
....
public ActionResult Index()
{
return View(new IndexViewModel()
{
Title = "Index",
IsAuthenticated = UserIsLoggedIn()
});
}
然而,要回答你的问题:
Razor是否有办法直接访问某个功能?
如果您使用的是ASP.NET Membership,则可以在请求中使用IsAuthenticated属性,例如
@Request.IsAuthenticated
否则,您需要将此信息传递给视图(无论是通过ViewBag
/ view model等。)
或者,您可以为Request
编写自己的扩展方法,以便您直接在视图中访问它:
@Request.UserLoggedIn()
或甚至作为HtmlHelper
例如
public static class HtmlHelperExtensions
{
public static bool UserIsLoggedIn(this HtmlHelper helper)
{
return /* authentication code here */
}
}
然后在您的观看中,您可以使用{<1}}我认为就是您所追求的。
答案 1 :(得分:4)
使用ViewModel类(您的视图将被强类型化,您将能够使用“经典”助手)。
//viewModel class
public class UserStatusViewModel {
public string Title {get;set;}
public bool IsLogged {get;set;
}
//action
public ActionResult Index() {
var model = new UserStatusViewModel{ Title = "Index", IsLogged = TheUser.CheckStatus()};
return View(model);
}
//view
@model UserStatusViewModel
@Html.DisplayFor(m => m.Title)
@Html.DisplayFor(m => m.IsLoggedIn)