0

我来自“常规”asp.net,所以我对 MVC 有点(完全)迷失了。

我用自己的 asp.net 编程模式做什么:

  • 我有一个自定义类对象,它代表“页面”及其属性(如 mypage.loadJquery、mypage.isLogged、mypage.Title、自定义缓存逻辑等)
  • 这个类在每个 ASHX 页面上实例化一次,然后我操作一个字符串生成器来生成 HTML,并在最后将它吐在浏览器上。
    • 在 ASHX 页面上只有一个请求,我可以在调用最终 response.write 时使用在顶部实例化的页面对象直到结束

现在我正在尝试使用 MVC。我“有点”理解 M/V/C 模型和路由概念。我想保留我的自定义“页面”对象,但我失去了页面生命周期,而且我绝对不知道如何在每次调用的顶部实例化我的页面对象一次。

我需要跨每个模型、控制器、视图、部分视图、htmlhelper 的实例化 ONCE 共享对象...

我意识到此时 MVC 模式可能会让我感到困惑,但是我该如何尝试重现我的需求呢?

(非常具体的例子:在每个请求上,我都需要检查用户是否通过他的 cookie 登录。如果是,我会往返数据库以获取用户信息。然后我确实需要在每个模型/控制器/视图上的这些信息应用程序,但当然不想每次都回滚到安全检查和数据库查询,我怎样才能在整个 mvc cyle 上获得这些信息?)

4

2 回答 2

0

我创建了很多这样的项目。基本上,您可以创建一个基本控制器类,所有其他控制器都从它继承。

[Authorize]
public class BaseController : Controller
{

    private Instructor _G_USER = null;

    protected Instructor G_USER 
    {
        get
        {
            if (_G_USER == null)
            {
                _G_USER = Your DB query here
                ViewData["G_USER"] = _G_USER;

            }
            return _G_USER;
        }
    }
}

然后在你的每一个孩子课堂上,你可以做

[Authorize]
public class YourController : BaseController
{
    public ActionResult Index()
    {
        if(!G_USER.CAN_DO_THIS)  throw new NoPermissionException();

        return View();
    }
}

要在视图中使用用户,请创建一个扩展方法。

public static class ExtentionMethods
{
    public static USER G_USER(this ViewPage page)
    {            
        return (USER)page.ViewData["G_USER"];
    }
}

然后像这样在页面中使用

<%=this.G_USER().....%>
于 2013-03-11T18:49:57.403 回答
0

在我的项目中,我创建了一个界面IViewModel,其中包含我在布局/母版页中需要的所有字段,并将其设置为它的模型,以便我可以轻松地使用它们:

视图模型.cs

public interface IViewModel
{
    string Title { get; set; }

    User User { get; set; }
}

布局.cshtml

@model IViewModel

<html>
    <head>
        <title>@Model.Title</title>
    </head>
    <body>
        @if (Model.User.IsAuthenticated) {
             You are logged as @Model.User.Name
        }
    </body>
</html>

我所有的模型都实现了该接口(或从 ViewModelBase 继承,这是该类的默认实现)。此外,我有自定义操作过滤器,用于检查返回的 ActionResult 是否为 (Partial)ViewResult 以及它的模型是否实现了我的IViewModel接口并在该接口中填充数据。

public FillViewModelAttribute : ActionFilterAttribute
{
    public override OnActionExecuted(ActionExecutedContext context)
    {
        var viewResult = context.Result as ViewResult;
        if (viewResult != null && viewResult.Model is IViewModel)
        {
            var viewModel = (IViewModel)viewResult.Model;
            // fill data
        }
    }
}
于 2013-03-11T18:52:20.237 回答