brantforthejim Ответов: 1

Как обновить несколько таблиц в ASP.NET использование edit view и контроллера


я пытаюсь отредактировать данные для приведенных ниже таблиц sql 3. используя asp.net в MVC, пожалуйста, см. ссылки сайт на цены на объекты DataTable
https://ibb.co/DWSHKwj


AspNetuser
Id = 100
Электронная почта = tim@yahoo.ca
Имя пользователя = Тимми

AspNetuserRole
UserId = 100
RoleID = 200

Аспнетроль
Id = 200
Имя = Администратор
Дискриминатор = null


как бы я отредактировал приведенную выше таблицу в контроллере и представлении? У меня есть детали отображения, но когда я нажимаю гиперссылку edit, я не могу отобразить данные.

редактирование просмотр страницы и сохранение:
Электронная почта = tim@yahoo.ca
Имя пользователя = Тимми
Имя = Администратор

Кнопка сохранения

AspNetUser.Id должен обновиться в AspNetUserRole.идентификатор пользователя
Аспнетроль.Id должен обновиться в AspNetUserRole.RoleID

Что я уже пробовал:

я ничего не могу найти на этом при поиске

1 Ответов

Рейтинг:
2

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>
Теперь вам просто нужно написать методы для загрузки и сохранения данных модели представления в базу данных. Поскольку у вас уже есть работающий дисплей, я предполагаю, что вы уже знаете, как это сделать. :)


Maciej Los

5ed!

brantforthejim

я не могу получить DataTable
currentRoles = LoadRolesForUserFromDatabase(model.Id);
DataTable allRoles = ListAllRolesFromDatabase();
DataRow row = LoadUserDetailsFromDatabase(id);
работать. он выделяется красным цветом. что бы я поставил здесь, чтобы заставить это работать?

ошибка не существует в текущем контексте

Richard Deeming

Это методы, которые вам нужно написать, а также CreateUserAndAssignRolesInDatabase и UpdateUserAndRolesInDatabase.

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