C# 在post上停止.cshtml呈现

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文件,但会引发空引用异

假设我在ASP.NET RazorPages中有此页面:

@{
    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>