我可以在 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"]
来为页面提供适当的标题(尽管可以在控制器)。
我正在使用 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"]
来为页面提供适当的标题(尽管可以在控制器)。