C# 在post上停止.cshtml呈现
假设我在ASP.NET RazorPages中有此页面:C# 在post上停止.cshtml呈现,c#,asp.net,asp.net-mvc,razor-pages,C#,Asp.net,Asp.net Mvc,Razor Pages,假设我在ASP.NET RazorPages中有此页面: @{ SocketGuild guild = (SocketGuild) ViewData["guild"] } <p>The guild has @(guild.Roles.Count) roles.</p> 当收到GET请求时,ViewData[“guild”]由OnGet处理程序设置,.cshtml呈现,允许返回页面 收到POST请求时,会呈现.cshtml文件,但会引发空引用异
@{
SocketGuild guild = (SocketGuild) ViewData["guild"]
}
<p>The guild has @(guild.Roles.Count) roles.</p>
当收到GET请求时,ViewData[“guild”]
由OnGet处理程序设置,.cshtml呈现,允许返回页面
收到POST请求时,会呈现.cshtml文件,但会引发空引用异常,因为尚未定义ViewData[“guild”]
。我不需要在文章中呈现.cshtml文件,因为我的请求是在后台提出的
如果已经执行了OnGet方法,是否可以只呈现.cshtml文件?如果有必要,我愿意切换到MVC风格的处理程序。我认为在您的情况下,正确的方法是通过某种服务保留实际价值,以便在
Post
请求中也可以访问:
public interface ICacheService
{
Dictionary<string, object> Values { get; set; }
}
public class CacheService : ICacheService
{
public Dictionary<string, object> Values { get; set; } = new Dictionary<string, object>();
}
这样,您就可以轻松地在代码中使用此类服务:
public class SocketGuildModel : PageModel
{
public ICacheService Cache { get; set; }
public SocketGuildModel(ICacheService cache)
{
Cache = cache;
}
public async Task OnGet()
{
Cache.Values["guild"] = GetGuild();
await Task.CompletedTask;
}
public async Task OnPost()
{
Console.WriteLine("Post Received");
await Task.CompletedTask;
}
public static SocketGuild GetGuild() => new SocketGuild();
}
public class SocketGuild
{
public List<string> Roles { get; set; } = new List<string>();
}
公共类SocketGuidModel:PageModel
{
公共ICacheService缓存{get;set;}
公共SocketGuildModel(ICacheService缓存)
{
缓存=缓存;
}
公共异步任务OnGet()
{
Cache.Values[“guild”]=GetGuild();
等待任务。完成任务;
}
公共异步任务OnPost()
{
控制台。WriteLine(“收到邮件”);
等待任务。完成任务;
}
public static SocketGuild GetGuild()=>new SocketGuild();
}
公营袜子公会
{
公共列表角色{get;set;}=new List();
}
@page
@使用RazorPagesDemo.Services
@模型RazorPagesDemo.Pages.SocketGuildModel
@{
var guild=(SocketGuild)Model.Cache.Values[“guild”];
}
公会有@(guild.Roles.Count)个角色
邮递
也就是说,根据您的具体需要,您还可以添加
,如果。。。否则…
你的.cshtml
文件中的逻辑和条件背后的门渲染(这可能是bool
IsPost
属性在OnGet
和OnPost
你的页面模型
方法中设置的)。哇,谢谢!CacheService值在不同请求之间到底是如何保持的?在过去,我曾尝试设置PageModel的一个属性,但它在请求之间被重置,就好像已经创建了PageModel的一个新实例一样。这是因为它是在Startup.cs中注册的吗?这要归功于依赖注入定义了三种不同的服务生存期类型<代码>瞬态
-每次访问对象时都会提供一个新实例<代码>作用域-对象在单个请求中保持不变Singleton
-始终存在单个实例,即使在不同的请求之间也是如此。这是我所知道的最好的解释:谢谢你提供的细节。我认为对于我的实现,我需要让CacheService类为每个用户返回不同的值,也许我可以通过添加一些自定义中间件来巧妙地实现。这段视频也很有用。非常感谢你!
public class SocketGuildModel : PageModel
{
public ICacheService Cache { get; set; }
public SocketGuildModel(ICacheService cache)
{
Cache = cache;
}
public async Task OnGet()
{
Cache.Values["guild"] = GetGuild();
await Task.CompletedTask;
}
public async Task OnPost()
{
Console.WriteLine("Post Received");
await Task.CompletedTask;
}
public static SocketGuild GetGuild() => new SocketGuild();
}
public class SocketGuild
{
public List<string> Roles { get; set; } = new List<string>();
}
@page
@using RazorPagesDemo.Services
@model RazorPagesDemo.Pages.SocketGuildModel
<form method="post" class="mt-3">
@{
var guild = (SocketGuild)Model.Cache.Values["guild"];
}
<p>The guild has @(guild.Roles.Count) roles.</p>
<button class="btn btn-primary" type="submit">Post</button>
</form>