如何将 ASP.NET Core 身份链接到另一个实体?
Posted
技术标签:
【中文标题】如何将 ASP.NET Core 身份链接到另一个实体?【英文标题】:How to link ASP.NET Core identity to another entity? 【发布时间】:2021-04-22 08:48:09 【问题描述】:伙计们,我想创建一个简单的应用程序,用户可以在其中发布他们想要的任何文本,带有标题和正文的内容。问题是我想通过身份验证使其私有化,这样我只能看到我使用我的电子邮件和密码发布的帖子,以实现我计划使用 Identity 的身份验证。
这是我要代表的模型:
我尝试在 C# 代码中执行此操作,结果如下:
该模型代码可以用于我想做的事情吗?
这是我的 ApplicationDbContext:
如果不是那么努力,我想要一个示例,为登录用户创建一个新帖子,然后显示该用户发布的帖子。
谢谢!
【问题讨论】:
看看MVC教程。应该有你正在寻找的一切开始。 docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/… 你可以得到当前用户喜欢这个问题***.com/questions/38751616/…然后获取/更新帖子 另一种方式是直接按 UserId 过滤帖子 我知道截图更容易,但它无助于搜索机器发现代码文本(将由其他人搜索)。而是键入代码,您可能只需复制代码并稍作修改(如果您想隐藏确切的代码)。 强烈建议将身份验证和业务逻辑解耦,即为仅指向 IdentityUser 的应用程序拥有自己的用户类/表。但这是一个广泛/基于意见的问题,与 Stack Overflow 无关。 【参考方案1】:这是一个完整的工作演示,您可以关注:
型号:
public class User:IdentityUser
public List<Post> Posts get; set;
public class Post
[Key]
public int PostId get; set;
public string Title get; set;
public string Body get; set;
[ForeignKey("User")]
[MaxLength(450)]
public string UserId get; set;
public User User get; set;
Index.cshtml:
@model IEnumerable<Post>
<h1>Index</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Body)
</th>
<th>
@Html.DisplayNameFor(model => model.User)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Body)
</td>
<td>
@Html.DisplayFor(modelItem => item.User.Id)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.PostId">Edit</a> |
<a asp-action="Details" asp-route-id="@item.PostId">Details</a> |
<a asp-action="Delete" asp-route-id="@item.PostId">Delete</a>
</td>
</tr>
</tbody>
</table>
创建.cshtml:
@model Post
@
ViewData["Title"] = "Create";
<h1>Create</h1>
<h4>Post</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Body" class="control-label"></label>
<input asp-for="Body" class="form-control" />
<span asp-validation-for="Body" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts
@await Html.RenderPartialAsync("_ValidationScriptsPartial");
控制器:
public class PostsController : Controller
private readonly ApplicationDbContext _context;
private readonly UserManager<User> _userManager;
public PostsController(ApplicationDbContext context,UserManager<User> userManager)
_context = context;
_userManager = userManager;
// GET: Posts
public async Task<IActionResult> Index()
var applicationDbContext = _context.Posts.Include(p => p.User)
.Where(a=>a.User.UserName==User.Identity.Name);
return View(await applicationDbContext.ToListAsync());
// GET: Posts/Create
public IActionResult Create()
return View();
// POST: Posts/Create
// To protect from overposting attacks, enable the specific properties you want to bind to, for
// more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Post post)
var user = _userManager.FindByNameAsync(User.Identity.Name).Result;
post.UserId = user.Id;
if (ModelState.IsValid)
_context.Add(post);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
return View(post);
确保更新您的 _LoginPartial.cshtml:
@using Microsoft.AspNetCore.Identity
@inject SignInManager<User> SignInManager
@inject UserManager<User> UserManager
确保更新您的 Startup.cs:
services.AddDefaultIdentity<User>()
.AddEntityFrameworkStores<ApplicationDbContext>();
结果:
【讨论】:
这对我理解身份和绑定项到 int 的工作方式有很大帮助。非常感谢!我有一个关于使用@Html.DisplayFor
的问题,你为什么用它而不是手动写Title、Body、User?并在循环中 @Html.DisplayFor
而不是 @item.以上是关于如何将 ASP.NET Core 身份链接到另一个实体?的主要内容,如果未能解决你的问题,请参考以下文章
选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?
从 ASP.NET MVC 迁移到 ASP.NET Core MVC
ASP.NET Core Web API - 如何将属性组合作为原始数据存储到另一个模型的单个列中
如何先用asp.net身份框架数据库将asp.net mvc迁移到asp.net core