我可以在 ASP.NET MVC 中将 ViewData 用作状态管理设备吗?

Can I use ViewData as a state management device in ASP.NET MVC?

我正在使用 ASP.NET MVC 和 Microsoft Identity 构建一个基本的博客站点。我想允许 post 的作者拥有删除权限,而其他人不应该。我想要做的是在控制器中操纵一个 ViewData["isAuthor"] 变量,并根据它们是否通过检查传递给返回的视图。

我没有错误,在我看来这是有效的,但由于某种原因,变量没有在控制器中重新计算。

这是我的剃须刀页面:

@model securitypractice.Models.Article

@{
    ViewData["Title"] = "Delete";
    ViewData["Deletable"] = true;
}

<h1>Delete</h1>

@if((bool)ViewData["Deletable"]! == true)
{
    <h3>Are you sure you want to delete this post?</h3>
<div>
    <hr />
    <dl class="row">
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.ArticleBody)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.ArticleBody)
        </dd>
    </dl>
    
    <form asp-action="Delete">
        <input type="hidden" asp-for="Id" />
        <input type="submit" value="Delete" class="btn btn-danger" /> |
        <a asp-action="Index">Back to List</a>
    </form>
    </div>
} else if((bool)ViewData["Deletable"]! == false)
{
    <div class="row">
        <div class="col-sm-8">
            <h2>Only the post author or moderator has the ability to delete a post.</h2>
             <a asp-action="Index">Back to List</a>
        </div>
    </div>
}

这是我的控制器:

// GET: Articles/Delete/5
    [Authorize]
    public async Task<IActionResult> Delete(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var article = await _context.Articles
                                    .FirstOrDefaultAsync(m => m.Id == id);

        if (article == null)
        {
            return NotFound();
        }

        ViewData["Deletable"] = (User.Identity.Name == article.Author) ? true : false;

        return View(article);
    }

从视图顶部删除行 ViewData["Deletable"] = true;

这实际上将值分配给 true 并将覆盖从控制器发送的值。


旁白:在视图中设置标题的原因是因为在 _Layout.cshtml 模板中使用了值 ViewData["Title"] 来为页面提供适当的标题(尽管可以在控制器)。