Я работаю с View
, который возвращает List<ViewModel>
в метод действия Create
Controller
.
Вопросы:
- Правильно ли вернуть
List<ViewModel>
контроллеру? Причина, по которой я это делаю, заключается в том, что мне нужно сделать несколько записей строк в БД для каждого пользователя. 2. Моя реализацияController
неверна, потому что я пытаюсь добавить данные через один пользовательский объект, где я получил список моделей представления, который является только представлением представления для одного пользователя. Так как же должен быть реализован контроллер? - Нужно ли мне иметь метод
public ActionResult Create()
в контроллере?
Ограничения:
- Не могу изменить базу данных
- Ни одна из таблиц пользователей или ролей в базе данных не имеет типа int
PK
Логика:
Пользователь сможет установить несколько флажков (представляет РОЛЬ) для каждого пользователя, и это должно быть сохранено в базе данных в виде одной строки. Например
БД: таблица dbo.User должна иметь следующие записи при сохранении
(abcdefg, levelA, locationB, Role2, null, null, Y)
(msjdhcdu, levelA, locationB, Role2, null, null, Y) Тот же пользователь Другая роль
(msjdhcdu, levelA, locationB, Role3, null, null, Y) Тот же пользователь Другая роль
Пользователь будет оставаться на той же странице (сохранить VIEW) после нажатия кнопки «Сохранить» и отображения последних изменений в базе данных.
Модель представления:
public class UserViewModel
{
public string UserName { get; set; }
public string Level { get; set; }
public string Location { get; set; }
public List<RoleViewModel> Roles { get; set; }
}
public class RoleViewModel
{
public string RoleName{ get; set; }
public bool IsSelected { get; set; }
}
Представление: возможно, я делаю что-то очень неправильно в представлении.
@model List<Project.ViewModels.UserViewModel>
@using (@Html.BeginForm("Create", "User", FormMethod.Post ,new { id = "UserPermissionForm" }))
{
<table class="table">
<tr>
<th>User</th>
@for (int i = 0; i < Model[0].Roles.Count; i++)
{
<th>
@Model[0].Roles[i].RoleName
</th>
}
</tr>
@for (int i = 0; i < Model.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(m => m[i].UserName)
@Model[i].UserName
</td>
@for (int j = 0; j < Model[i].Roles.Count; j++)
{
<td>
@Html.CheckBoxFor(m => m[i].Roles[j].IsSelected)
</td>
}
</tr>
}
</table>
<div class="form-actions">
<button type="submit" class="btn btn-success submit" value="Save">Save changes</button>
</div>
<script>
$('#Submit').click(function () {
let url = '@Url.Action("Create", "Users")'
$.post(url, $("#UserPermissionForm"))
});
</script>
Контроллер:
[HttpPost]
public ActionResult Create(List<UserViewModel> viewModelList)
{
for (int i= 0; i > viewModelList.Count; i++) {
for (int j = 0; j > viewModelList[i].Roles.Count; j++) {
db.UserDetails.Add(new User
{
username = viewModelList[i].UserName,
level = viewModelList[i].Level,
location = viewModelList[i].Location,
role = viewModelList[i].Roles[j].RoleName,
Approval = "",
Request = "",
Active = "Y"
});
}
db.SaveChanges();
return RedirectToAction("Index","Users");
}
return View(viewModelList); // not right
}
Ошибка:
Элемент модели, переданный в словарь, имеет тип «System.Collections.Generic.List`1[Project.ViewModels.UserViewModel]», но для этого словаря требуется элемент модели типа «Project.Models.User».
Любое руководство/помощь приветствуется.
EDIT1: добавлено представление EDIT2: добавлена бизнес-логика
@model
- person Divyang Desai   schedule 19.10.2016Project.Models.User
. Где конкретно эта ошибка происходит? Вы уверены, что это правильный взгляд? - person David   schedule 19.10.2016javaScript
в представлении неверен. Когда я отправляю по почте. - person shaz   schedule 19.10.2016@model Project.Models.User
. Поскольку я не хочу использовать этот автоматически сгенерированный VIEW, должен ли я перенаправить его на VIEW, который я показал здесь/удалить этот автоматически сгенерированный VIEW? - person shaz   schedule 19.10.2016