gpt4 book ai didi

asp.net-mvc - ASP.NET MVC - 在基本 Controller 中为母版页设置 ViewData

转载 作者:行者123 更新时间:2023-12-03 09:54:33 24 4
gpt4 key购买 nike

我在我的 ASP.NET MVC 项目中使用了母版页。此母版页需要存在一些 ViewData,它会在每个页面上显示此内容。

如果我没有在我的 Controller 中设置这个 ViewData 键,我会收到一个找不到它的错误。但是,我不想在每个 Controller 中设置 ViewData(我不想在每个 Controller 中都说 ViewData["foo"] = GetFoo();)。

所以,我想在一个基本 Controller 中设置它,并让每个 Controller 都从这个基本 Controller 继承。在基本 Controller 默认构造函数中,我设置了 ViewData。我在这里找到了类似的方法:http://www.asp.net/learn/MVC/tutorial-13-cs.aspx.到目前为止一切顺利,这有效......但问题是这些数据来自某个地方的数据库。

现在,当我想对我的 Controller 进行单元测试时,从基本 Controller 继承的 Controller 调用其默认构造函数。在默认构造函数中,我初始化我的存储库类以从数据库中获取此数据。结果:我的单元测试失败,因为它无法访问数据(我当然不希望他们访问这些数据)。

我也不想将正确的 Repository(或 DataContext,不管你怎么命名)类传递给每个 Controller ,然后将它传递给默认 Controller ,然后我可以用我的单元测试来模拟。 Controller 反过来依赖于其他存储库类,我最终会向构造函数传递多个参数。我的感觉工作太多了,还是我错了?还有其他解决方案吗?

我试过使用 StructureMap,但最后我觉得这不会解决我的问题,因为每个 Controller 仍然必须调用将初始化存储库类的基本构造函数,所以我不能模拟它。

This是一个类似的问题,但我发现没有给出满意的答案。我能否以简洁的方式解决这个问题,也许使用 StructureMap 作为解决方案?或者我应该吮吸它并将存储库传递给每个 Controller 并再次传递给基本 Controller ?再一次,对于这么简单的事情来说,感觉像是做了很多工作。谢谢!

最佳答案

我看到两个选项:

第一:

在 YourBaseController.OnActionExecuting() 或 YourBaseController.OnActionExecuted() 中为 MasterPage 设置 ViewData:

public class YourBaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Optional: Work only for GET request
if (filterContext.RequestContext.HttpContext.Request.RequestType != "GET")
return;

// Optional: Do not work with AjaxRequests
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
return;

...

filterContext.Controller.ViewData["foo"] = ...
}
}

第二:

或创建自定义过滤器:
public class DataForMasterPageAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Optional: Work only for GET request
if (filterContext.RequestContext.HttpContext.Request.RequestType != "GET")
return;

// Optional: Do not work with AjaxRequests
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
return;

...

filterContext.Controller.ViewData["foo"] = ...
}
}

然后应用于您的 Controller :
[DataForMasterPage]
public class YourController : YourBaseController
{
...
}

我认为第二种解决方案完全适合您的情况。

关于asp.net-mvc - ASP.NET MVC - 在基本 Controller 中为母版页设置 ViewData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/976493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com