如何将ViewData赋值逻辑抽离到独立类,供Action返回的视图正常读取
实现方案
ASP.NET Core MVC 中,
ViewData是当前控制器实例持有的ViewDataDictionary类型字典,视图渲染时会直接读取该实例存储的键值对,所以只要Create方法修改的是当前控制器的同一个ViewData实例,就能保证视图正常获取到对应值。
- 注意你代码中写的
SomeDataCretor存在拼写错误,正确拼写为SomeDataCreator,注意修正避免编译错误。
方案1:直接传入ViewData参数(最稳妥,无上下文依赖问题)
首先修改控制器的调用代码:
public IActionResult Index() { _someDataCreator.Create(ViewData); return View(); }
SomeDataCreator 的实现参考:
public class SomeDataCreator { public void Create(ViewDataDictionary viewData) { // 此处替换为你原来生成SomeData值的业务逻辑 var someDataValue = /* 原来的赋值逻辑 */; viewData["SomeData"] = someDataValue; // 如需同时赋值多个ViewData键,也可以在此处统一处理 // viewData["OtherData"] = otherValue; } }
方案2:无传参实现(依赖上下文访问,适合批量复用场景)
如果不想每次调用都传ViewData参数,可以通过依赖注入的服务获取当前请求的上下文,自动拿到对应控制器的ViewData,需要提前完成如下配置:
- 在
Program.cs中注册依赖服务和SomeDataCreator:
// 注册上下文访问服务 builder.Services.AddHttpContextAccessor(); builder.Services.AddSingleton<IActionContextAccessor, ActionContextAccessor>(); // 注册为Scoped生命周期,和请求生命周期一致 builder.Services.AddScoped<SomeDataCreator>();
SomeDataCreator的实现参考:
public class SomeDataCreator { private readonly IActionContextAccessor _actionContextAccessor; public SomeDataCreator(IActionContextAccessor actionContextAccessor) { _actionContextAccessor = actionContextAccessor; } public void Create() { var controllerContext = _actionContextAccessor.ActionContext as ControllerContext; if (controllerContext == null) return; var viewData = controllerContext.ViewData; // 此处替换为你原来生成SomeData值的业务逻辑 var someDataValue = /* 原来的赋值逻辑 */; viewData["SomeData"] = someDataValue; } }
内容的提问来源于stack exchange,提问作者ilyaVlad
相关产品推荐
相关产品推荐

