C# 如何在另一个页面中显示一个页面?

C# 如何在另一个页面中显示一个页面?,c#,asp.net-core,razor-pages,C#,Asp.net Core,Razor Pages,在我的主页(索引)页面上,如果用户未登录,我希望登录表单直接位于我的主页中,但如果用户已登录,则将显示索引页面。如果我使用了\u LoginPartial,则会按预期加载此页面,但如果使用文件夹(如Account)中的其他页面,则会出现错误 CSHTML: @if (SignInManager.IsSignedIn(User)) { <p> Welcome to my website</p> } else { @await Html.PartialAsyn

在我的主页(索引)页面上,如果用户未登录,我希望登录表单直接位于我的主页中,但如果用户已登录,则将显示索引页面。如果我使用了
\u LoginPartial
,则会按预期加载此页面,但如果使用文件夹(如Account)中的其他页面,则会出现错误

CSHTML:

@if (SignInManager.IsSignedIn(User))
{
    <p> Welcome to my website</p>
}
else
{
    @await Html.PartialAsync("Account/Login")
}
@if(SignInManager.IsSignedIn(用户))
{
欢迎来到我的网站

} 其他的 { @等待Html.partialSync(“帐户/登录”) }
`InvalidOperationException:传递到 ViewDataDictionary的类型为“CS.Pages.Manifest.IndexModel”,但 ViewDataDictionary实例需要类型为的模型项 “CS.Pages.Account.LoginModel”

LoginModel构造函数:

public LoginModel(SignInManager<ApplicationUser> signInManager, ILogger<LoginModel> logger)
{
    _signInManager = signInManager;
    _logger = logger;
}
public LoginModel(SignInManager SignInManager,ILogger logger)
{
_signInManager=signInManager;
_记录器=记录器;
}

尝试将LoginModel实例传递到局部视图

@if (SignInManager.IsSignedIn(User))
{
    <p> Welcome to my website</p>
}
else
{
    @await Html.PartialAsync("Account/Login", new LoginModel())
}
@if(SignInManager.IsSignedIn(用户))
{
欢迎来到我的网站

} 其他的 { @等待Html.partialSync(“Account/Login”,new LoginModel()) }
尝试将LoginModel实例传递到局部视图

@if (SignInManager.IsSignedIn(User))
{
    <p> Welcome to my website</p>
}
else
{
    @await Html.PartialAsync("Account/Login", new LoginModel())
}
@if(SignInManager.IsSignedIn(用户))
{
欢迎来到我的网站

} 其他的 { @等待Html.partialSync(“Account/Login”,new LoginModel()) }
当您加载类似于以下内容的部分内容时:

@await Html.PartialAsync("Account/Login")
从中调用它的视图的模型是隐式传递的,就像您执行了以下操作一样:

@await Html.PartialAsync("Account/Login", Model)
因此,您收到了错误消息。分部需要类型为
LoginModel
的模型,但您将传递类型为
IndexModel
的模型。当然,解决方案是传入正确类型的模型,即
LoginModel
。但是,您的
LoginModel
必须使用类型为
SignInManager的参数来构造,这将为您的设置提供更大的灵活性,并允许您执行注入,这正是您在这里需要的

本质上,您只需创建一个继承自
ViewComponent
的类,并实现方法
InvokeAsync

public class LoginViewComponent : ViewComponent
{
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly ILogger<LoginModel> _logger;

    public LoginViewComponent(SignInManager<ApplicationUser> signInManager, ILogger<LoginModel> logger)
    {
        _signInManager = signInManager;
        _logger = logger;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        var model = await GetModelAsync().ConfigureAwait(false);
        return View(model);
    }

    public Task<LoginModel> GetModelAsync()
    {
        return Task.FromResult(new LoginModel(_signInManager, _logger));
    }
}

使用is方法,所有功能(包括模型的创建和传入)都是自包含的,因此可以在任何地方调用它,无论是在单个视图中,还是在您的布局中。

当您加载类似于:

@await Html.PartialAsync("Account/Login")
从中调用它的视图的模型是隐式传递的,就像您执行了以下操作一样:

@await Html.PartialAsync("Account/Login", Model)
因此,您收到了错误消息。分部需要类型为
LoginModel
的模型,但您将传递类型为
IndexModel
的模型。当然,解决方案是传入正确类型的模型,即
LoginModel
。但是,您的
LoginModel
必须使用类型为
SignInManager的参数来构造,这将为您的设置提供更大的灵活性,并允许您执行注入,这正是您在这里需要的

本质上,您只需创建一个继承自
ViewComponent
的类,并实现方法
InvokeAsync

public class LoginViewComponent : ViewComponent
{
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly ILogger<LoginModel> _logger;

    public LoginViewComponent(SignInManager<ApplicationUser> signInManager, ILogger<LoginModel> logger)
    {
        _signInManager = signInManager;
        _logger = logger;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        var model = await GetModelAsync().ConfigureAwait(false);
        return View(model);
    }

    public Task<LoginModel> GetModelAsync()
    {
        return Task.FromResult(new LoginModel(_signInManager, _logger));
    }
}

使用is方法,所有功能(包括模型的创建和传入)都是自包含的,因此可以在任何地方调用它,无论是在单个视图中,还是在您的布局中。

我有
@model IndexModel
,我需要索引模型,因此我得到
缺少一个或多个编译引用。确保您的项目正在引用“Microsoft.NET.Sdk.Web”,并且“PreserveComilationContext”属性未设置为false。
如果传递null而不是LoginModel()实例,该怎么办?-
@await Html.partialSync(“帐户/登录”,null)
。我认为您得到了“InvalidOperationException”,因为IndexModel正在被传递到Login视图中,它需要LoginModel。我不明白你在评论中提到的第二个错误。你能详细说明一下你是什么时候得到这个的吗?当我使用“@wait Html.partialsync”(“Account/Login”,new LoginModel())”时,我得到了这个
没有给出与“LoginModel.LoginModel(signInManager,ILogger)”所需的形式参数“signInManager”相对应的参数“
我尝试了nulll,但它说
传递到ViewDataDictionary中的模型项是“CS.Pages.IndexModel”类型,但是此ViewDataDictionary实例需要类型为“CS.Pages.Account.LoginModel”的模型项。
我已将登录构造函数添加到我的问题中。将null模型强制转换为
LoginModel
后传递该模型应能解决该问题
@await Html.partialSync(“帐户/登录”,“登录模型”为空)
。另一种选择是将其保留为IndexModel的属性,并传递此链接中提到的内容-我有
@model IndexModel
,我需要索引模型,因此我得到
一个或多个编译引用缺失。确保您的项目正在引用“Microsoft.NET.Sdk.Web”,并且“PreserveComilationContext”属性未设置为false。
如果传递null而不是LoginModel()实例,该怎么办?-
@await Html.partialSync(“帐户/登录”,null)
。我认为您得到了“InvalidOperationException”,因为IndexModel正在被传递到Login视图中,它需要LoginModel。我不明白你在评论中提到的第二个错误。你能详细说明一下你是什么时候得到这个的吗?当我使用“@wait Html.partialsync”(“Account/Login”,new LoginModel())”时,我得到了这个
没有给出与“LoginModel.LoginModel(signInManager,ILogger)”所需的形式参数“signInManager”相对应的参数“
我尝试了nulll,但它说,
传递到ViewDataDictionary的模型项的类型为“CS.Pages.IndexModel”,但此ViewDataDictionary实例需要类型为“CS.Pages.Account.LoginModel”的模型项。
我已将登录构造函数添加到我的问题中。之后传递null模型