2

我有一个这样的控制器:

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

            return View();
        }

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

@TheUser.CheckStatus

代替

@ViewBag.LoggedIn
4

2 回答 2

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 模型等)

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

@Request.UserLoggedIn()

甚至作为一个HtmlHelper例子

public static class HtmlHelperExtensions
{ 
    public static bool UserIsLoggedIn(this HtmlHelper helper)
    {
        return /* authentication code here */
    }
}

然后在您看来,您可以使用@Html.UserIsLoggedIn()认为您所追求的。

于 2013-01-23T15:19:26.283 回答
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)
于 2013-01-23T15:19:02.640 回答