Допустим есть модель:
public class Book
{
public int id;
public string Title;
...
}
И как теперь сделать так что бы каждый пользователь имел набор Book, то есть каждый Book принадлежит одному пользователю и НЕ может быть показан другим.
Предполагаю что так:
public class Book
{
public int id;
public string Title;
public ссылка на пользователя;
...
}
//Или наоборот - пользователь хранит ссылку на свои данные
Как это правильно(и безопасно) делать? (Пожалуйста с примером получения и изменения данных в контроллере).
Предположим, что у вас есть пустой Asp.Net MVC проект в котором вы при создании выбрали Individual User Accounts. Это вполне рабочая заготовка, в которой уже есть вход по логину-паролю, примеры страниц с представлениями. Начнём с неё.
Проверьте, что у вас есть модель пользователя:
// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit https://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
И создайте заготовку модели для книг:
public class Book
{
public int ID { get; set; }
public string Title { get; set; }
}
Первое что нам нужно - это создать отношение один-ко-многим между Book и ApplicationUser (у одной книги может быть только один пользователь(владелец), у одного пользователя может быть множество книг). Этот момент относится к Entity Framework, выучите его внимательно, так как это база, от которой строятся более сложные вещи.
В класс Book добавляем:
public int OwnerId { get; set; }
[ForeignKey("OwnerId")]
public virtual ApplicationUser Owner { get; set; }
В класс ApplicationUser добавляем:
public virtual ICollection<Book> Books { get; set; }
И не забываем добавить в ApplicationDbContext
public DbSet<Book> Book { get; set; }
(Тут по-хорошему момент как применить миграции - Add-Migration CreateBookTable, Update-Database но можете и не пользоваться)
В принципе, всё. Дальше можете создавать контроллеры и представления, которые хотите.
Допустим, для простоты у вас есть некоторый базовый контроллер, чтобы удобнее работать с базой:
public class BaseController : Controller
{
public BaseController()
{
this.DbContext = new ApplicationDbContext();
}
protected ApplicationDbContext DbContext { get; }
}
И вы хотите показать только книги какого-то определённого пользователя.
Контроллер:
public class BookController : BaseController
{
public ActionResult GetUserBook(int ownerID)
{
var books = this.DbContext.Book
.Where(x => x.OwnerId == ownerID)
.ToArray();
return View(books);
}
}
Представление:
@model WebApplication1.Models.Book[]
<h2>title</h2>
@foreach (var book in Model)
{
@book.Title<br>
}
Или, если вы хотите, чтобы каждый видел только свои книги:
public ActionResult MyBooks()
{
if (!this.User.Identity.IsAuthenticated)
return this.Redirect("/");
var books = this.DbContext.Book
.Where(x => x.OwnerId == this.User.Identity.GetUserId<int>())
.ToArray();
return View(books);
}
Отдельно рекомендую вот что. По умолчанию Microsoft для модели пользователя предлагает первичный ключ в виде строки... Однако иногда удобнее работать с int - поэтому можете отдельно потренироваться в смене типа для UserId. Вот есть хорошая статья на эту тему.
Пример, который я привёл - учебный, в нём многие моменты сделаны по-простому. Скажем, авторизацию проще проверить так:
[Authorize]
public ActionResult MyBooks()
{
var books = this.DbContext.Book
.Where(x => x.OwnerId == this.User.Identity.GetUserId<int>())
.ToArray();
return View(books);
}
Можно отделить домен от слоя данных. Но вам пока достаточно такой тривиальный пример отработать.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости