Richard Deeming
Начните с представления-модели:
public class UserViewModel
{
public int Id { get; set; }
public string EmailAddress { get; set; }
public string Username { get; set; }
public List<UserRoleViewModel> Roles { get; set; }
}
public class UserRoleViewModel
{
public int RoleId { get; set; }
public string RoleName { get; set; }
public bool IsSelected { get; set; }
}
В контроллере вам нужно будет заполнить модель представления:
private void PopulateRoles(UserViewModel model)
{
// Load all of the role names from the database:
DataTable allRoles = ListAllRolesFromDatabase();
// Convert the roles to the view-model:
var roles = allRoles.AsEnumerable()
.Select(r => new UserRoleViewModel
{
RoleId = r.Field<int>("Id"),
RoleName = r.Field<string>("Name")
})
.ToDictionary(r => r.RoleId);
if (model.Roles != null)
{
// We've posted back to the server - take the selected roles from the form:
foreach (var role in model.Roles.Where(r => r.IsSelected))
{
if (roles.TryGetValue(role.RoleId, out var vm))
{
vm.IsSelected = true;
}
}
}
else if (model.Id != 0)
{
// We're editing an existing user - load their roles from the database:
DataTable currentRoles = LoadRolesForUserFromDatabase(model.Id);
foreach (DataRow row in currentRoles.Rows)
{
int id = row.Field<int>("Id");
if (roles.TryGetValue(id, out var vm))
{
vm.IsSelected = true;
}
}
}
// Set the roles on the view-model:
model.Roles = roles.Values.ToList();
}
Вызовите этот метод перед отображением представления добавления/редактирования:
[HttpGet]
public ActionResult Add()
{
var model = new UserViewModel();
PopulateRoles(model);
return View(model);
}
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Add(UserViewModel model)
{
if (!ModelState.IsValid)
{
PopulateRoles(model);
return View(model);
}
CreateUserAndAssignRolesInDatabase(model);
return RedirectToAction(nameof(Index));
}
[HttpGet]
public ActionResult Edit(int id)
{
DataRow row = LoadUserDetailsFromDatabase(id);
if (row is null) return RedirectToAction(nameof(Index));
var model = new UserViewModel
{
Id = row.Field<int>("Id"),
EmailAddress = row.Field<string>("Email"),
Username = row.Field<string>("Username"),
};
PopulateRoles(model);
return View(model);
}
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Edit(UserViewModel model)
{
if (!ModelState.IsValid)
{
PopulateRoles(model);
return View(model);
}
UpdateUserAndRolesInDatabase(model);
return RedirectToAction(nameof(Index));
}
Затем в режиме добавления/редактирования отобразите список флажков для ролей - здесь я использую Bootstrap 4:
<div class="form-group row">
<label class="col-form-label col-sm-3">Roles</label>
<div class="col-sm">
<ul class="list-unstyled">
@for (int index = 0; index < Model.Roles.Count; index++)
{
<li>
<div class="form-check mt-2">
@Html.HiddenFor(m => m.Roles[index].RoleId)
@Html.CheckBoxFor(m => m.Roles[index].IsSelected, new { @class = "form-check-input" })
@Html.LabelFor(m => m.Roles[index].IsSelected, Model.Roles[index].RoleName)
</div>
</li>
}
</ul>
</div>
</div>
Теперь вам просто нужно написать методы для загрузки и сохранения данных модели представления в базу данных. Поскольку у вас уже есть работающий дисплей, я предполагаю, что вы уже знаете, как это сделать. :)
brantforthejim
я не могу получить DataTable
currentRoles = LoadRolesForUserFromDatabase(model.Id);
DataTable allRoles = ListAllRolesFromDatabase();
DataRow row = LoadUserDetailsFromDatabase(id);
работать. он выделяется красным цветом. что бы я поставил здесь, чтобы заставить это работать?
ошибка не существует в текущем контексте
Richard Deeming
Это методы, которые вам нужно написать, а также CreateUserAndAssignRolesInDatabase
и UpdateUserAndRolesInDatabase
.
Как я уже сказал, Поскольку у вас уже есть работающий дисплей, я предполагаю, что вы знаете, как написать базовый код доступа к базе данных.