Lio*_*ion 12 asp.net asp.net-mvc razor asp.net-core-mvc asp.net-core
我的主题有某种面包屑.控制器始终是类别.为了避免重复我自己,我想在控制器的构造函数中为所有操作设置它,如下所示:
class MyController:Controller{
public MyController() {
ViewBag.BreadcrumbCategory = "MyCategory";
}
}
Run Code Online (Sandbox Code Playgroud)
当我ViewBag.BreadcrumbCategory在布局视图中访问时,它为null.在一个行动中它起作用:
class MyController:Controller{
public IActionResult DoSomething() {
ViewBag.BreadcrumbCategory = "MyCategory";
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道在构造函数中设置ViewBag属性是不可能的?在执行此工作的每个操作上调用函数将是令人烦恼且没有好的做法.在使用构造函数的另一个问题是一个被接受的answear,但正如我所说,这不起作用,至少对于ASP.NET Core.
Tse*_*eng 19
有关于它的GitHub问题,并且声明这是设计的.您链接的答案是关于ASP.NET MVC3,旧的旧版ASP.NET堆栈.
ASP.NET Core是从头开始编写的,它使用不同的概念,专为可移植性(多个平台)以及性能和现代实践而设计,例如内置支持依赖注入.
最后一个使得无法ViewBag在构造函数中进行设置,因为Constructor必须通过Property Injection注入基类的某些属性,因为您可能已经注意到您不必在派生控制器中传递这些依赖项.
这意味着,当Controller调用构造函数时HttpContext,ControllerContext不会设置属性等.它们仅在调用构造函数后设置,并且存在对此对象的有效实例/引用.
正如GitHub问题所指出的那样,它不会被修复,因为这是设计的.
正如您在此处所看到的,ViewBag具有依赖性,ViewData并ViewData在控制器初始化后填充.如果你调用ViewBag.Something = "something",那么你将创建一个新的DynamicViewData类实例,它将被构造函数初始化后的实例替换.
正如@SLaks指出的那样,您可以使用为每个控制器配置的操作过滤器.
以下示例假定您始终从Controller基类派生控制器.
public class BreadCrumbAttribute : IActionFilter
{
private readonly string _name;
public BreadCrumbAttribute(string name)
{
_name = name;
}
public void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
var controller = context.Controller as Controller;
if (controller != null)
{
controller.ViewBag.BreadcrumbCategory = _name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在你应该能够用它来装饰你的控制器.
[BreadCrumb("MyCategory")]
class MyController:Controller
{
}
Run Code Online (Sandbox Code Playgroud)
我有同样的问题,并解决它覆盖OnActionExecuted控制器的方法:
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
ViewBag.Module = "Production";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5328 次 |
| 最近记录: |