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

时间:2013-01-23 15:13:58

标签: c# .net razor viewbag

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

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

            return View();
        }

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

@TheUser.CheckStatus

而不是

@ViewBag.LoggedIn

2 个答案:

答案 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)