我正在尝试将MVC 5应用程序迁移到ASP.NET 5 MVC 6(Beta 7)。
在同时使用@model
和_ViewImports
指令时遇到问题。
单独使用时工作正常。
在我的@inherits
我添加了public abstract class BaseViewPage<TModel> : RazorPage<TModel>
{
protected MyPrincipal AppUser
{
get
{
return new MyPrincipal(this.User as ClaimsPrincipal);
}
}
}
指令,以使用带有一些自定义用户属性的基页。
@inherits CommonWeb.BaseViewPage<TModel>
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
_ViewImports.cshttml
@model
然后我可以在所有视图中使用 AppUser。。
如果我不使用强类型视图,则此方法有效。如果我在任何视图中添加public class ViewHelper
{
ViewContext _context;
public ViewHelper(ViewContext context)
{
_context = context;
}
public MyPrincipal AppUser
{
get
{
return new MyPrincipal(_context.HttpContext.User as ClaimsPrincipal);
}
}
public string ControllerName
{
get
{
return _context.RouteData.Values["controller"].ToString();
}
}
}
指令,则继承的视图页面就会消失。
帮助表示赞赏
更新
我在先前版本的web.config中使用自定义 pageBaseType 成功完成了此操作。
解决方法。
@{ var viewHelper = new ViewHelper(ViewContext);}
查看:
var test = `
.myUglyClass {
propOne: abc;
notSpecialProp: def;
propThree: ghi;
}
.myClass {
propOne: abc;
specialProp: def;
propThree: ghi;
}
`;
为所有观点实现此目的的方法?
答案 0 :(得分:4)
MVC 6中有一种更好的方法,它现在支持使用@inject
指令的injecting dependencies视图。 (指令@inject IFoo Foo
允许您在视图中使用Foo
类型IFoo
的属性
为获取应用用户创建新界面IAppUserAccessor
,例如:
public interface IAppUserAccessor
{
MyPrincipal GetAppUser();
}
创建一个实现它的类AppUserAccessor
:
public class AppUserAccessor : IAppUserAccessor
{
private IHttpContextAccessor httpContextProvider;
public AppUserAccessor(IHttpContextAccessor httpContextProvider)
{
this.httpContextProvider = httpContextProvider;
}
public MyPrincipal GetAppUser()
{
return new MyPrincipal (
httpContextProvider.HttpContext.User as ClaimsPrincipal);
}
}
通过在 Startup.cs 的ConfigureServices
方法中添加新条目,在服务容器中注册新界面:
services.AddTransient<IAppUserAccessor, AppUserAccessor>();
最后使用@inject
指令在视图中注入IAppUserAccessor
。 如果您在ViewImports.cshtml
中添加该指令,那么它将在每个视图中都可用。
@inject WebApplication4.Services.IAppUserAccessor AppUserAccessor
通过以上所有部分,您现在可以在视图中使用它:
@AppUserAccessor.GetAppUser()
<强>更新强>
如果你需要检查路由值,比如控制器名称,你可以在你的类中注入IActionContextAccessor
并按如下方式使用它:
public AppUserAccessor(IHttpContextAccessor httpContextProvider, IActionContextAccessor actionContextAccessor)
{
this.httpContextProvider = httpContextProvider;
this.actionContextAccessor = actionContextAccessor;
}
...
public string ControllerName
{
get { return actionContextAccessor.ActionContext.RouteData.Values["controller"].ToString(); }
}
当然,这看起来不再是AppUserAccessor
,并且闻起来有不同的责任感。至少它需要一个更合适的名称:)
我会仔细检查我需要什么控制器名称。可能有更好的方法来实现您的目标。 (例如,如果您需要它来生成新的链接/网址,您可能只使用IUrlHelper
)
访问ViewContext
看起来beta8已经添加了对注入ViewContext的支持,尽管实现细节可能会在RC之前发生变化。见this question