MVC 6 @inherit RazorPage

时间:2015-09-26 02:20:54

标签: asp.net asp.net-mvc asp.net-core asp.net-core-mvc

我正在尝试将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;
    }
`;

为所有观点实现此目的的方法?

1 个答案:

答案 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