您是否始终必须设置ViewBag变量才能从控制器访问数据

Jim*_*988 2 .net c# razor viewbag

我有一个像这样的控制器:

        public ActionResult Index()
        {
            ViewBag.Title = "Index";
            ViewBag.LoggedIn = TheUser.CheckStatus();

            return View();
        }
Run Code Online (Sandbox Code Playgroud)

事实是,我必须将LoggedIn设置为我的其他函数TheUser.CheckStatus()的输出,以便我可以用razor引用它... Razor有没有办法直接访问函数?例如...

@TheUser.CheckStatus
Run Code Online (Sandbox Code Playgroud)

代替

@ViewBag.LoggedIn
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 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()
    });
}
Run Code Online (Sandbox Code Playgroud)

但是,要回答你的问题:

Razor有没有办法直接访问某个功能?

如果您使用的是ASP.NET成员资格,则可以在请求中使用IsAuthenticated属性,例如

 @Request.IsAuthenticated
Run Code Online (Sandbox Code Playgroud)

否则,您需要将此信息传递给视图(无论是通过ViewBag/视图模型等)

或者,您可以编写自己的扩展方法,Request以便您可以直接在视图中访问它:

@Request.UserLoggedIn()
Run Code Online (Sandbox Code Playgroud)

或者甚至作为HtmlHelper例如

public static class HtmlHelperExtensions
{ 
    public static bool UserIsLoggedIn(this HtmlHelper helper)
    {
        return /* authentication code here */
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您可以使用@Html.UserIsLoggedIn()认为您所追求的内容.