2016-05-08 15 views
1

In meiner ASP.NET MVC-Anwendung können Benutzer Projekte veröffentlichen, und sie werden in der Datenbank gespeichert. Wie üblich gibt es eine Indexansicht für die Projekte, in der Benutzer die Liste aller verfügbaren Projekte zusammen mit einigen Aktionslinks neben ihnen sehen können (Details/Übernehmen).
Wenn ein Benutzer auf den Aktionslink "Übernehmen" klickt, wird er gebeten, ein paar Worte darüber zu sagen, warum er teilnehmen möchte (Anschreiben). Nachdem er sich angemeldet hat, wird eine Anwendung in der Datenbank gespeichert, die einen eindeutigen ApplicationId, den UserId des Benutzers und den ProjectId enthält, an dem er sich beworben hat, damit ich den Überblick über alle Anwendungen behalten kann.ASP.NET Identity die E-Mail des Benutzers von UserId abrufen

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

In der Ansicht „Details“, um alle Daten des Projekts wird angezeigt und verwaltet, es zu bekommen alle Anschreiben anzuzeigen und die Benutzer-ID des für dieses Projekt angewendet.

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

Die UserId und CoverLetter aus der Anwendung ist jedoch erfolgreich abgerufen, was ich brauche auf den UserId basierte den Namen des Benutzers und E-Mail aus der Datenbank abgerufen werden.

Edit: hier ist die gesamte 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); 
     } 
    } 
} 

Muss ich tatsächlich etwas in der ApplicationController ändern? Ich bin mir nicht sicher, wie ich das machen soll.

+0

Nach dem Projekt zu finden. Verwenden Sie die 'UserId' des Projekts, um das Benutzerobjekt aus dem' UserManager.FindByIdAsync' zu holen. Sie müssen Ihr Rückgabemodell ändern, um diese Informationen an Ihre Ansicht zurückzugeben. – Nkosi

Antwort

0

Ich fand die Lösung, viel einfacher.

Innerhalb der ProjectsController Details der GET-Methode:

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); 
} 

Im Grunde die gesamte User-Einheit innerhalb des var 'user' abgerufen werden. Dann sende ich es einfach mit 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> 
} 

initialisiert ich die Usermanager wie so:

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; } 
1

Sie müssen möglicherweise Ihre ApplicationController nicht ändern. Nach dem Finden der Project, verwenden Sie Project.UserId, um die zugehörige User aus dem Identity-Framework wie ... UserManager.FindByIdAsync(userId) zu erhalten.

Sie müssen das zurückgegebene Modell ändern, um diese Informationen an Ihre Ansicht zurückzugeben, aber es ist möglich, das zu erreichen, was Sie anfordern.

Ihre aktuelle Application Klasse Da Sie ein neues Modell von Grund auf neu erstellen oder über Vererbung, das Hinzufügen der Eigenschaften, die Sie für Ihre Ansicht benötigen ...

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

... Die oben zeigen das Modell über Vererbung.

Sie können dann einen Blick Modell für Ihre Ansicht erstellen, die alle Informationen, um die benötigten Details ...

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

jetzt so, dass Sie verwenden Asp.Net-Identity-Framework, um Sie Anzeige zeigen, müssen hält diese Annahme angesichts Ihrer ProjectsController kann so etwas modifiziert werden ...

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; 
    } 
} 

Sie dann den Namen des Benutzers und E-Mail in der Ansicht verweisen kann ...

@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> 
} 
+0

Ich fürchte, ich kann den IUserManager nirgends finden? Die Datei IdentityUser.cs enthält nur "public class IdentityUser etc ...". Ich habe den vollen ProjectsController gepostet, es ist ziemlich lang. – crystyxn

+0

Ich habe Probleme beim Initialisieren des IUserManager userManager. Bist du sicher, dass es nicht etwas anderes heißt? – crystyxn

+0

'IUserManager' war nur eine Konzeptschnittstelle, keine tatsächliche Klasse, es sei denn, Sie haben Ihre eigene Abstraktion erstellt. Sie haben angegeben, dass Sie das Identitätsframework verwenden, daher sollte es irgendwo im Projekt eine UserManager-Klasse geben, mit der Sie Benutzerinformationen abrufen können. Wo speichern Sie Benutzername und E-Mail? – Nkosi

Verwandte Themen