EF 6 / ASP.NET MVC 5에서 사용자 항목을 해당 특정 사용자로만 제한하는 방법

SJCypher

특정 사용자 만 자신의 항목을 볼 수 있고 다른 사람은 볼 수 없도록 사용자 항목을 제한하려고합니다. 즉, 내가 한 모든 작업을 수행 한 후에도 응용 프로그램에 입력 된 모든 항목이 표시됩니다. 모든 사용자가 항목을 볼 수 있습니다.

Entity Framework의 Code First 규칙을 사용하여 내 Expenses 테이블의 외래 키를 내 AspNetUsers의 기본 키로 참조하여 일대 다 관계를 만들었지 만 다른 사용자로 로그인하면 여전히 다른 사용자가 입력 한 항목 (비용)을 확인합니다.

문제가 내 관점, 모델 또는 컨트롤러에 있는지 확실하지 않습니다.

현재 가지고있는 코드는 다음과 같습니다.

IdentityModel :

 public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
    {
        Expenses = new List<Expense>();
    }

    [Required]
    public string Fullname { get; set; }
    [Required]
    public string Province { get; set; }
    [Required]
    public string Company { get; set; }
    public virtual ICollection<Expense> Expenses { get; set; }

    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 ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("PacificPetEntities", throwIfV1Schema: false)
    {
    }

    public IDbSet<Expense> Expenses { get; set; }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }



}

비용 모델 :

public class Expense : IValidatableObject
{
    public Expense() { }

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    [Required]
    public string Category { get; set; }
    public string Description { get; set; }

    [Required]
    [Display(Name = "Gross Amount")]
    public double GrossAmount { get; set; }
    [Required]
    [Display(Name = "Tax Amount")]
    public double TaxAmount { get; set; }
    [Required]
    [Display(Name = "Net Amount")]
    public double NetAmount { get; set; }
    public int Mileage { get; set; }
    [Display(Name = "Mileage Rate")]
    public double MileageRate { get; set; }

    [Required]
    [Display(Name = "Date Submitted")]
    public DateTime? DateSubmitted { get; set; }
    [Required]
    [Display(Name = "Expense Date")]
    public DateTime? ExpenseDate { get; set; }


    public string UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual ApplicationUser ApplicationUser { get; set; }



    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Category == "Auto - Mileage" && Mileage == 0)
        {
            yield return new ValidationResult("You must enter a mileage amount if the chosen category is mileage.");
        }
    }

}

컨트롤러 :

public class ExpensesController : Controller
{
    private ApplicationDbContext db = new ApplicationDbContext();

    // GET: Expenses
    [Authorize]
    public ActionResult Index()
    {
        var expenses = db.Expenses.Include(e => e.ApplicationUser);
        return View(expenses.ToList());
    }

    // GET: Expenses/Details/5
    [Authorize]
    public ActionResult Details(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Expense expense = db.Expenses.Find(id);
        if (expense == null)
        {
            return HttpNotFound();
        }
        return View(expense);
    }

    // GET: Expenses/Create
    [Authorize]
    public ActionResult Create()
    {
        ViewBag.UserId = new SelectList(db.Users, "Id", "Fullname");
        return View();
    }

    // POST: Expenses/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    [Authorize]
    public ActionResult Create([Bind(Include = "ID,Category,Description,GrossAmount,TaxAmount,NetAmount,Mileage,MileageRate,DateSubmitted,ExpenseDate,UserId")] Expense expense)
    {
        if (ModelState.IsValid)
        {
            db.Expenses.Add(expense);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.UserId = new SelectList(db.Users, "Id", "Fullname", expense.UserId);
        return View(expense);
    }

    // GET: Expenses/Edit/5
    [Authorize]
    public ActionResult Edit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Expense expense = db.Expenses.Find(id);
        if (expense == null)
        {
            return HttpNotFound();
        }
        ViewBag.UserId = new SelectList(db.Users, "Id", "Fullname", expense.UserId);
        return View(expense);
    }

    // POST: Expenses/Edit/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    [Authorize]
    public ActionResult Edit([Bind(Include = "ID,Category,Description,GrossAmount,TaxAmount,NetAmount,Mileage,MileageRate,DateSubmitted,ExpenseDate,UserId")] Expense expense)
    {
        if (ModelState.IsValid)
        {
            db.Entry(expense).State = System.Data.Entity.EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.UserId = new SelectList(db.Users, "Id", "Fullname", expense.UserId);
        return View(expense);
    }

    // GET: Expenses/Delete/5
    [Authorize]
    public ActionResult Delete(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Expense expense = db.Expenses.Find(id);
        if (expense == null)
        {
            return HttpNotFound();
        }
        return View(expense);
    }

    // POST: Expenses/Delete/5
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    [Authorize]
    public ActionResult DeleteConfirmed(int id)
    {
        Expense expense = db.Expenses.Find(id);
        db.Expenses.Remove(expense);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }
}

Index.cshtml :

 @model IEnumerable<PacificPetExpenses.Models.Expense>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.ApplicationUser.Fullname)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Category)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Description)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.GrossAmount)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.TaxAmount)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.NetAmount)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Mileage)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.MileageRate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.DateSubmitted)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ExpenseDate)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.ApplicationUser.Fullname)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Category)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Description)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.GrossAmount)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TaxAmount)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.NetAmount)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Mileage)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MileageRate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.DateSubmitted)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ExpenseDate)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

</table>

도와주세요.

감사합니다.

SJCypher

답을 찾았습니다. Padhraic은 정말 가깝지만 그의 대답은 내 문제를 해결하는 데 도움이되었습니다.

내 컨트롤러에는 다음이 있습니다.

public ActionResult Index()
{
    var expenses = db.Expenses.Include(e => e.ApplicationUser);
    return View(expenses.ToList());
}

대신 다음과 같아야합니다.

public ActionResult Index()
{
    string currentUserId = User.Identity.GetUserId();
    var expenses = db.Expenses.Where(e => e.UserId == currentUserId);
    return View(expenses.ToList());
}

내 질문에 대한 Stephen Muecke의 의견에 따르면 db.Expenses.Include (e => e.ApplicationUser) 는 내 데이터베이스의 모든 행을 반환했습니다. 대신 결과를 현재 사용자로 필터링해야했습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ASP.NET Core MVC에서 Html.DropDownListFor suppet 집합 이름 특성을 사용자 지정하는 방법

분류에서Dev

사용자 지정 기본 프로젝트에서 ASP.NET Core MVC 상용구를 만드는 방법

분류에서Dev

asp.net mvc의 컨트롤러에서 특정 사용자에게 작업 방법에 대한 액세스를 제공하는 방법

분류에서Dev

asp.net mvc에서 사용자 지정 jQuery를 통해 확인란 목록의 유효성을 검사하는 방법

분류에서Dev

ASP.NET MVC 5 (ID)의 다른 (관리자 역할) 계정에서 새 사용자 계정을 만드는 방법

분류에서Dev

ASP.NET MVC 5에서 applozic을 사용하는 방법

분류에서Dev

ASP.Net MVC 5에서 다 대다 동일한 테이블 (사용자)을 처리하는 방법-Fluent API

분류에서Dev

ASP.NET Core에서 EF로 여러 사용자를 관리하는 방법

분류에서Dev

ASP.NET MVC 4에서 권한이 부여 된 특정 사용자에게 특정 HTML 요소를 표시하는 방법

분류에서Dev

Jquery를 사용하여 asp.net 형식의 특정 파일에 공백을 넣지 않도록 사용자를 제한하는 방법

분류에서Dev

ASP.NET MVC에서 사용자 지정 양식을 사용하여 스트라이프 결제를 통합하는 방법은 무엇입니까?

분류에서Dev

ASP.NET Core 3.1 MVC에서 사용자 지정 라우팅을 수행하는 방법

분류에서Dev

asp.net에서만 특정 사용자에게만 드롭 다운 목록을 표시하는 방법은 무엇입니까?

분류에서Dev

인터페이스를 통해 현재 로그인 한 사용자 이름을 가져와 asp.net core mvc의 열에 의해 업데이트 된 항목에 삽입하는 방법은 무엇입니까?

분류에서Dev

asp net mvc의 컨트롤러에서 사용자 지정 메서드를 사용하는 방법

분류에서Dev

ASP.NET MVC-EvoHtmlToPdf에서 사용자 지정 Culture를 사용하는 방법

분류에서Dev

ASP.net MVC 5에서 사용자 지정 페이징을 부트 스트랩에 의존하는 방법은 무엇입니까?

분류에서Dev

Fullcalendar에서 특정 사용자에 대해서만 편집 가능을 true로 설정하는 방법

분류에서Dev

Razor에 액세스하지 않고 Angular에서 사용하기 위해 ASP.NET MVC에서 자산을 번들로 묶는 방법은 무엇입니까?

분류에서Dev

Asp.net 5 MVC 6 사용자 지정 인증

분류에서Dev

asp.net mvc에 사용자 지정 CSS 파일을 추가하는 방법은 무엇입니까?

분류에서Dev

ASP.Net MVC 5 다중 로그인 (다중 사용자 테이블)과 함께 특성 권한 부여를 사용하는 방법

분류에서Dev

Asp.net MVC에서 사용자 지정 특성의 매개 변수를 동적으로 전달하는 방법

분류에서Dev

MVC에서 사용자 지정 라우팅을 사용하여 사용자 지정 URL을 만드는 방법

분류에서Dev

ASP.net, C #을 사용하여 PrincipalContext에 의해 Active Directory에 관리자 특성을 추가하는 방법

분류에서Dev

MVC에서 사용자 지정 경로를 만드는 방법

분류에서Dev

ASP .NET Core 3.1 MVC의 특정 경로에 대한 사용자 지정 미들웨어 (또는 권한 부여)

분류에서Dev

특정 계정에 대해서만 Google을 사용한 ASP.NET Core 인증

분류에서Dev

Ef6 Code First를 사용하여 asp mvc5에서 기본 ApplicationDbContext를 확장하는 간단한 방법

Related 관련 기사

  1. 1

    ASP.NET Core MVC에서 Html.DropDownListFor suppet 집합 이름 특성을 사용자 지정하는 방법

  2. 2

    사용자 지정 기본 프로젝트에서 ASP.NET Core MVC 상용구를 만드는 방법

  3. 3

    asp.net mvc의 컨트롤러에서 특정 사용자에게 작업 방법에 대한 액세스를 제공하는 방법

  4. 4

    asp.net mvc에서 사용자 지정 jQuery를 통해 확인란 목록의 유효성을 검사하는 방법

  5. 5

    ASP.NET MVC 5 (ID)의 다른 (관리자 역할) 계정에서 새 사용자 계정을 만드는 방법

  6. 6

    ASP.NET MVC 5에서 applozic을 사용하는 방법

  7. 7

    ASP.Net MVC 5에서 다 대다 동일한 테이블 (사용자)을 처리하는 방법-Fluent API

  8. 8

    ASP.NET Core에서 EF로 여러 사용자를 관리하는 방법

  9. 9

    ASP.NET MVC 4에서 권한이 부여 된 특정 사용자에게 특정 HTML 요소를 표시하는 방법

  10. 10

    Jquery를 사용하여 asp.net 형식의 특정 파일에 공백을 넣지 않도록 사용자를 제한하는 방법

  11. 11

    ASP.NET MVC에서 사용자 지정 양식을 사용하여 스트라이프 결제를 통합하는 방법은 무엇입니까?

  12. 12

    ASP.NET Core 3.1 MVC에서 사용자 지정 라우팅을 수행하는 방법

  13. 13

    asp.net에서만 특정 사용자에게만 드롭 다운 목록을 표시하는 방법은 무엇입니까?

  14. 14

    인터페이스를 통해 현재 로그인 한 사용자 이름을 가져와 asp.net core mvc의 열에 의해 업데이트 된 항목에 삽입하는 방법은 무엇입니까?

  15. 15

    asp net mvc의 컨트롤러에서 사용자 지정 메서드를 사용하는 방법

  16. 16

    ASP.NET MVC-EvoHtmlToPdf에서 사용자 지정 Culture를 사용하는 방법

  17. 17

    ASP.net MVC 5에서 사용자 지정 페이징을 부트 스트랩에 의존하는 방법은 무엇입니까?

  18. 18

    Fullcalendar에서 특정 사용자에 대해서만 편집 가능을 true로 설정하는 방법

  19. 19

    Razor에 액세스하지 않고 Angular에서 사용하기 위해 ASP.NET MVC에서 자산을 번들로 묶는 방법은 무엇입니까?

  20. 20

    Asp.net 5 MVC 6 사용자 지정 인증

  21. 21

    asp.net mvc에 사용자 지정 CSS 파일을 추가하는 방법은 무엇입니까?

  22. 22

    ASP.Net MVC 5 다중 로그인 (다중 사용자 테이블)과 함께 특성 권한 부여를 사용하는 방법

  23. 23

    Asp.net MVC에서 사용자 지정 특성의 매개 변수를 동적으로 전달하는 방법

  24. 24

    MVC에서 사용자 지정 라우팅을 사용하여 사용자 지정 URL을 만드는 방법

  25. 25

    ASP.net, C #을 사용하여 PrincipalContext에 의해 Active Directory에 관리자 특성을 추가하는 방법

  26. 26

    MVC에서 사용자 지정 경로를 만드는 방법

  27. 27

    ASP .NET Core 3.1 MVC의 특정 경로에 대한 사용자 지정 미들웨어 (또는 권한 부여)

  28. 28

    특정 계정에 대해서만 Google을 사용한 ASP.NET Core 인증

  29. 29

    Ef6 Code First를 사용하여 asp mvc5에서 기본 ApplicationDbContext를 확장하는 간단한 방법

뜨겁다태그

보관