В моем приложении ASP.NET MVC пользователи могут публиковать проекты, и они будут храниться в БД. Как обычно, для проектов есть индексное представление, где пользователи могут видеть список всех доступных проектов, а также ссылки на действия рядом с ними (Подробности / Применить).
Когда пользователь нажимает на ссылку действия «Применить», его просят ввести несколько слов о том, почему он хочет участвовать (сопроводительное письмо). После того, как он отправит заявку, приложение сохраняется в базе данных, содержащей уникальный ApplicationId, пользовательский UserId и ProjectId, к которому он обращается, поэтому я могу отслеживать все приложения.

public class Application
{
    public int ApplicationId { get; set; }
    public int ProjectId { get; set; }
    public string UserId { get; set; }
    public string CoverLetter { get; set; }
}

В представлении «Подробности» отображаются все данные проекта, и удалось заставить их отображать все сопроводительные письма и идентификаторы пользователя, которые применялись для этого проекта.

Cover letters:
@foreach (var item in Model.Applications)
{
    <tr>
        <td>
            <br/>
            @Html.DisplayFor(modelItem => item.CoverLetter) |
            @Html.DisplayFor(modelItem => item.UserId) |
        </td>
    </tr>
}

UserId и CoverLetter из приложения извлекаются успешно, однако то, что мне нужно, основано на UserId для извлечения имени пользователя и адреса электронной почты из базы данных.

Изменить: вот весь ProjectsController:

   using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web.Mvc;
using System.Web.Security;
using Leepio.Models;
using Microsoft.ApplicationInsights.Web;
using Microsoft.AspNet.Identity;

namespace Leepio.Controllers
{
    public class ProjectsController : Controller
    {
        private ApplicationDbContext db = new ApplicationDbContext();

        // GET: Projects
        [Authorize(Roles = "companyRole, studentRole")]
        public ActionResult Index(string SortOrder, string SortBy, string Page)
        {
            ViewBag.SortOrder = SortOrder;
            ViewBag.SortBy = SortBy;
            var projects = db.Projects.ToList();




            var model = new ApplicationTwoViewModel
            {
                Model1 = new List<Project>(projects),
                Model2 = new Application
                {

                    UserId = User.Identity.GetUserId(),
                    ProjectId = 11,
                    CoverLetter = "asdf",
                    ApplicationId = 23,
                }
            };

            switch (SortBy)
            {
                case "Title":
                 switch (SortOrder)
                    {
                        case "Asc":
                            projects = projects.OrderBy(x => x.Title).ToList();
                            break;
                        case "Desc":
                            projects = projects.OrderByDescending(x => x.Title).ToList();
                            break;
                        default:
                            break;
                    }
                    break;

                case "ApplicationDeadline":
                    switch (SortOrder)
                    {
                        case "Asc":
                            projects = projects.OrderBy(x => x.ApplicationDeadline).ToList();
                            break;
                        case "Desc":
                            projects = projects.OrderByDescending(x => x.ApplicationDeadline).ToList();
                            break;
                        default:
                            break;
                    }
                    break;

                case "Duration":
                    switch (SortOrder)
                    {
                        case "Asc":
                            projects = projects.OrderBy(x => x.Duration).ToList();
                            break;
                        case "Desc":
                            projects = projects.OrderByDescending(x => x.Duration).ToList();
                            break;
                        default:
                            break;
                    }
                    break;
                case "HourlyRate":
                    switch (SortOrder)
                    {
                        case "Asc":
                            projects = projects.OrderBy(x => x.HourlyRate).ToList();
                            break;
                        case "Desc":
                            projects = projects.OrderByDescending(x => x.HourlyRate).ToList();
                            break;
                        default:
                            break;
                    }
                    break;
                case "TotalProjectCost":
                    switch (SortOrder)
                    {
                        case "Asc":
                            projects = projects.OrderBy(x => x.TotalProjectCost).ToList();
                            break;
                        case "Desc":
                            projects = projects.OrderByDescending(x => x.TotalProjectCost).ToList();
                            break;
                        default:
                            break;
                    }
                    break;
                case "City":
                    switch (SortOrder)
                    {
                        case "Asc":
                            projects = projects.OrderBy(x => x.City).ToList();
                            break;
                        case "Desc":
                            projects = projects.OrderByDescending(x => x.City).ToList();
                            break;
                        default:
                            break;
                    }
                    break;
                case "RequiredPresencePercent":
                    switch (SortOrder)
                    {
                        case "Asc":
                            projects = projects.OrderBy(x => x.RequiredPresencePercent).ToList();
                            break;
                        case "Desc":
                            projects = projects.OrderByDescending(x => x.RequiredPresencePercent).ToList();
                            break;
                        default:
                            break;
                    }
                    break;
                case "Language":
                    switch (SortOrder)
                    {
                        case "Asc":
                            projects = projects.OrderBy(x => x.Language).ToList();
                            break;
                        case "Desc":
                            projects = projects.OrderByDescending(x => x.Language).ToList();
                            break;
                        default:
                            break;
                    }
                    break;
                case "RequiredSkills":
                    switch (SortOrder)
                    {
                        case "Asc":
                            projects = projects.OrderBy(x => x.RequiredSkills).ToList();
                            break;
                        case "Desc":
                            projects = projects.OrderByDescending(x => x.RequiredSkills).ToList();
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    projects = projects.OrderBy(x => x.Title).ToList();
                    break;
            }



            ViewBag.TotalPages = Math.Ceiling(db.Projects.ToList().Count()/10.0);
            int page = int.Parse(Page == null ? "1" : Page);
            ViewBag.Page = page;
            model.Model1 = projects;    
            model.Model1 = model.Model1.Skip((page - 1) * 10).Take(10).ToList();
            return View(model);

        }



        private UserManager<IUser<>  userManager;


        // GET: Projects/Details/5
        [Authorize(Roles = "companyRole, studentRole")]
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            Project project = db.Projects.Find(id);

            if (project == null)
            {
                return HttpNotFound();
            }
            return View(project);
        }

        // GET: Projects/Create
        [Authorize(Roles= "companyRole")]
        public ActionResult Create()
        {
            return View();
        }

        // POST: Projects/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(Roles = "companyRole")]
        public ActionResult Create([Bind(Include = "UserId,ProjectId,Title,ApplicationDeadline,Duration,HourlyRate,TotalProjectCost,City,RequiredPresencePercent,Language,RequiredSkills,Description")] Project project)
        {
            if (ModelState.IsValid)
            {
                project.UserId = User.Identity.GetUserId();
                db.Projects.Add(project);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(project);
        }

        // GET: Projectts/Edit/5
        [Authorize(Roles = "companyRole")]
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Project project = db.Projects.Find(id);
            if (project == null)
            {
                return HttpNotFound();
            }
            return View(project);
        }

        // POST: Projects/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(Roles = "companyRole")]
        public ActionResult Edit([Bind(Include = "ProjectId,UserId,Title,ApplicationDeadline,Duration,HourlyRate,TotalProjectCost,City,RequiredPresencePercent,Language,RequiredSkills,Description")] Project project)
        {
            if (ModelState.IsValid)
            {

                if (project.UserId == User.Identity.GetUserId())
                { 
                db.Entry(project).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
                }

                return HttpNotFound("Project is not yours!");

            }
            return View(project);
        }

        // GET: Projects/Delete/5
        [Authorize(Roles = "companyRole")]
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Project project = db.Projects.Find(id);
            if (project == null)
            {
                return HttpNotFound();
            }
            return View(project);
        }

        // POST: Projects/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        [Authorize(Roles = "companyRole")]
        public ActionResult DeleteConfirmed(int id)
        {
            Project project = db.Projects.Find(id);
            if (project.UserId == User.Identity.GetUserId())
            {
                db.Projects.Remove(project);
                db.SaveChanges();
            }
            else
            {
                return HttpNotFound("Project is not yours!");
            }


            return RedirectToAction("Index");
        }

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

Мне действительно нужно что-то менять внутри ApplicationController? Я не знаю, как это сделать.

1
crystyxn 8 Май 2016 в 16:56

2 ответа

Лучший ответ

Я нашел решение, гораздо более простое.

Внутри метода GET ProjectsController Details:

public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    Project project = db.Projects.Find(id);
    var user = UserManager.FindByIdAsync(project.UserId);
    ViewData["user"] = user.Result.Email;

    if (project == null)
    {
        return HttpNotFound();
    }
    return View(project);
}

В основном получение всей сущности User внутри переменной 'user'. Затем я просто отправляю его в представление с помощью ViewData ["user"] = user.Result.Email;

@foreach (var item in Model.Applications)
{
    <tr>
        <td>
            <br />
            @Html.DisplayFor(modelItem => item.CoverLetter) |
            @Html.DisplayFor(modelItem => @ViewData["user"])
        </td>
    </tr>
}

Я инициализировал UserManager так:

private ApplicationDbContext db = new ApplicationDbContext();

public ProjectsController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
{

}

public ProjectsController(UserManager<ApplicationUser> userManager)
{
    UserManager = userManager;
}

public UserManager<ApplicationUser> UserManager { get; set; }
0
Nkosi 6 Июн 2016 в 22:49

Возможно, вам не придется изменять свой ApplicationController. Найдя Project, используйте Project.UserId, чтобы получить связанный User из структуры идентификации, например ... UserManager.FindByIdAsync(userId).

Вам нужно будет изменить вашу возвращенную модель, чтобы передать эту информацию обратно в ваше представление, но можно добиться того, что вы запрашиваете.

Учитывая ваш текущий класс Application, вы можете создать новую модель с нуля или посредством наследования, добавив свойства, необходимые для вашего представления ...

public class ProjectDetailsApplicationModel : Application {
    public string UserName { get; set; }
    public string Email { get; set; }
}

... Выше показана модель через наследование.

Затем вы можете создать модель представления для своего представления, которая содержит всю информацию, необходимую для отображения необходимых деталей ...

public class ProjectDetailsModel {
    public Project Project { get; set; }
    public IEnumerable<ProjectDetailsApplicationModel> Applications { get; set; }
}

Теперь вы указываете, что используете фреймворк Asp.Net-Identity, поэтому, учитывая это предположение, ваш ProjectsController может быть изменен на что-то вроде этого ...

public class ProjectsController : Controller {
    private ApplicationDbContext db;
    private ApplicationUserManager userManager;

    public ProjectController() {
        this.userManager =  new ApplicationUserManager();
        this.db = new ApplicationDbContext();
    }

    //...other code removed for brevity

    public async Task<ActionResult> Details(int? id) {
        if (id == null) {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        Project project = db.Projects.Find(id);

        if (project == null) {
            return HttpNotFound();
        }
        //construct model...                    
        var model = new ProjectDetailsViewModel {
            Project = project,
            Applications = await BuildApplicationModels(project.Applications)
        }

        return View(model);
    }
    private async Task<IEnumerable<ProjectDetailsApplicationModel>> BuildApplicationModels(IEnumerable<Application> applications) {
        List<ProjectDetailsApplicationModel> result = new List<ProjectDetailsApplicationModel>();
        foreach (var application in applications) {
            var model = new ProjectDetailsApplicationModel {
                ApplicationId = application.ApplicationId,
                ProjectId = application.ProjectId,
                UserId = application.UserId,
                CoverLetter = application.CoverLetter
            };

            var user = await userManager.FindByIdAsync(application.UserId);
            if (user != null) {
                model.UserName = user.UserName;
                model.Email = user.Email;
            }
            result.Add(model);
        }
        return result;
    }
}

Затем вы можете указать имя и адрес электронной почты пользователя в представлении ...

@model: ProjectDetailsModel

<!--...other markup...-->

Cover letters:
@foreach (var item in Model.Applications)
{
    <tr>
        <td>
            <br/>
            @Html.DisplayFor(modelItem => item.CoverLetter) |
            @Html.DisplayFor(modelItem => item.UserName) |
            @Html.DisplayFor(modelItem => item.Email) |
        </td>
    </tr>
}
1
Nkosi 9 Май 2016 в 13:16