Мне удалось обойти проблему.Возможно, это не самое лучшее решение, но оно работает.Вот решение ниже.Я заменил ReportsTo из приведенного выше кода на SuperiorID в решении.Обратите внимание, что у моих пользователей Identity есть целые числа для их идентификаторов, а не GUID, как у реализации Identity по умолчанию.
С помощью приведенного ниже кода я связал пользователя Identity с другим пользователем Identity.
В моих моделях идентификацииУ меня в ApplicationUser есть следующее: класс Identity User:
public class ApplicationUser : IdentityUser<int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>, IUser<int>
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int? SuperiorID { get; set; }
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
public async Task<ClaimsIdentity>
GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager)
{
var userIdentity = await manager
.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
return userIdentity;
}
public virtual ApplicationUser Superior { get; set; }
}
Я создал реферат для начальства, который наследует Identity User, чтобы я мог получить идентификатор и полное имя пользователя, которые я также поместил в свой идентификатор.Модели:
public abstract class Superior : IdentityUser
{
}
Я добавил следующее в свой RegisterViewModel, чтобы я мог добавить улучшенный при создании пользователя:
public class RegisterViewModel
{
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
[Display(Name = "Superior")]
public virtual ApplicationUser Superior { get; set; }
}
Я добавил следующее в свой EditUserViewModel, чтобы я мог редактироватьПревосходящий пользователь в моем представлении редактирования:
public class EditUserViewModel
{
public int Id { get; set; }
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
[Display(Name = "Superior")]
public int? SuperiorID { get; set; }
public virtual ApplicationUser Superior { get; set; }
}
Вот код для UserController.Я удалил код, не связанный с этим, и оставил некоторый код, чтобы указать, куда должен идти код:
Это относится к основному классу:
private ApplicationDbContext db = new ApplicationDbContext();
public async Task<ActionResult> Index(int? SelectedSuperior)
{
var superiors = db.Users.OrderBy(s => s.FirstName).ToList();
ViewBag.SelectedSuperior = new SelectList(superiors, "Id", "FullName", SelectedSuperior);
int superiorID = SelectedSuperior.GetValueOrDefault();
IQueryable<ApplicationUser> users = db.Users
.Where(c => !SelectedSuperior.HasValue || c.SuperiorID == superiorID)
.OrderBy(d => d.Id)
.Include(d => d.Superior);
var sql = users.ToString();
return View(await UserManager.Users.ToListAsync());
}
public ActionResult Create()
{
PopulateSuperiorsDropDownList();
return View();
}
public async Task<ActionResult> Create(RegisterViewModel userViewModel)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser
{
FirstName = userViewModel.FirstName,
LastName = userViewModel.LastName,
SuperiorID = userViewModel.SuperiorID,
};
}
PopulateSuperiorsDropDownList(userViewModel.SuperiorID);
return View();
}
public async Task<ActionResult> Edit(int id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var user = await UserManager.FindByIdAsync(id);
if (user == null)
{
return HttpNotFound();
}
var model = new EditUserViewModel()
{
Id = user.Id,
FirstName = user.FirstName,
LastName = user.LastName,
SuperiorID = user.SuperiorID,
};
PopulateSuperiorsDropDownList(user.SuperiorID);
return View(model);
}
public async Task<ActionResult> Edit([Bind(Include = "Email,Id,FirstName,LastName,SuperiorID")] EditUserViewModel editUser)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindByIdAsync(editUser.Id);
if (user == null)
{
return HttpNotFound();
}
// Update the User:
user.Email = editUser.Email;
user.FirstName = editUser.FirstName;
user.LastName = editUser.LastName;
user.SuperiorID = editUser.SuperiorID;
}
ModelState.AddModelError("", "Something failed.");
PopulateSuperiorsDropDownList(editUser.SuperiorID);
return View();
}
private void PopulateSuperiorsDropDownList(object selectedSuperior = null)
{
var superiorsQuery = from s in db.Users
orderby s.FirstName + " " + s.LastName
select s;
ViewBag.SuperiorID = new SelectList(superiorsQuery, "Id", "FullName", selectedSuperior);
}
Вот раскрывающийся список дляпредставление создания и редактирования, так что пользователю может быть назначен улучшенный:
@Html.DropDownList("SuperiorID", null, "Choose Superior", htmlAttributes: new { @class = "form-control" })
Для отображения полного имени улучшенного пользователя на странице сведений, я использую следующий код:
@Html.TextBoxFor(m => m.Superior.FullName, new { @class = "form-control", @disabled = "disabled" })
Чтобы показать полное имя старшего пользователя в моей таблице данных на моей странице указателя, я использовал следующий метод:
<table class="table" id="users-table" width="100%">
<thead>
<tr>
<th title="First Name">
First Name
</th>
<th title="Last Name">
Last Name
</th>
<th title="Superior">
Superior
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Superior.FullName)
</td>
</tr>
}
</tbody>
</table>