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模型