У меня возникли проблемы с вводом значения в ViewModel, поскольку он продолжает возвращать значение null после того, как значение введено через cshtml.
Значение, которое я ввожу в cshtml
После нажатия подтвердить
CreateViewModel.cs
public class CreateGroupViewModel
{
public string AppUserId { get; set; }
public AppUser AppUser { get; set; }
public Department Department { get; set; }
public DayGroup DayGroup { get; set; }
}
DayGroup.cs
public class DayGroup
{
public string Id { get; set; }
public DateTime SubcriptionDate { get; set; }
public Group Group { get; set; }
}
Создать метод
[HttpGet]
public async Task<IActionResult> Create()
{
var userId = _contextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
var appUser = await _appUserRepository.GetByIdAsync(userId);
var department = await _groupRepository.GetDepartmentByUserAsync(appUser);
var createGroupViewModel = new CreateGroupViewModel()
{
AppUserId = userId,
AppUser = appUser,
Department = department,
};
createGroupViewModel.Department.Persons = await _groupRepository.GetPeopleByDepartmentAsync(department);
return View(createGroupViewModel);
}
[HttpPost]
public async Task<IActionResult> Create(CreateGroupViewModel model)
{
model.AppUserId = _contextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
model.AppUser = await _appUserRepository.GetByIdAsync(model.AppUserId);
model.Department = await _groupRepository.GetDepartmentByUserAsync(model.AppUser);
//all other logic
}
Создать.cshtml
@using QLAnCaWeb.ViewModels
@model CreateGroupViewModel
<div class = "container mb-3">
<div class = "row pt-4">
<div class = "col-6">
<h2 class = "text-primaary">
ĐĂNG KÝ ĂN CA CHO TẬP THỂ
</h2>
<h3>
HỌ TÊN: @Model.AppUser.Name
</h3>
<h3>
PHÒNG BAN: @Model.Department.DepartmentName
</h3>
<form method = "post" asp-action = "Create">
@{
Model.DayGroup = new DayGroup();
}
<div class = "row g-3 align-items-center">
<div class = "col-auto">
<label for = "SubDate" class = "col-form-label">NGÀY ĐĂNG KÝ: </label>
</div>
<div class = "col-auto">
<input type = "date" id = "SubDate" asp-for = "@Model.DayGroup.SubcriptionDate" class = "form-control" />
<span asp-validation-for = "@Model.DayGroup.SubcriptionDate" class = "text-dark"></span>
</div>
</div>
</form>
</div>
</div>
</div>
<form method = "post" asp-action = "Create" class = "row g-3">
<div class = "mb-3 row">
<div class = "col-sm-3">
<input type = "text" readonly class = "form-control-plaintext" value = "DS HỌ TÊN" />
</div>
<div class = "col">
<input type = "text" readonly class = "form-control-plaintext" value = "CA 1" />
</div>
<div class = "col">
<input type = "text" readonly class = "form-control-plaintext" value = "CA 2" />
</div>
<div class = "col">
<input type = "text" readonly class = "form-control-plaintext" value = "CA 3" />
</div>
</div>
@foreach (var person in Model.Department.Persons)
{
<div class = "row">
<div class = "col">
<input type = "text" readonly class = "form-control-plaintext" value = "@person.Name">
</div>
<div class = "col">
<input class = "form-control" type = "number" asp-for = "@person.Set1" />
<span asp-validation-for = "@person.Set1" class = "text-dark"></span>
</div>
<div class = "col">
<input class = "form-control" type = "number" asp-for = "@person.Set2" />
<span asp-validation-for = "@person.Set2" class = "text-dark"></span>
</div>
<div class = "col">
<input class = "form-control" type = "number" asp-for = "@person.Set3" />
<span asp-validation-for = "@person.Set3" class = "text-dark"></span>
</div>
</div>
}
<div class = "row g-3 align-items-center">
<div class = "col-auto">
<button type = "submit" class = "btn btn-primary">Submit</button>
</div>
<div class = "col-auto">
<a class = "btn btn-danger" asp-controller = "Home" asp-action = "Index">Cancel</a>
</div>
</div>
</form>
Я хочу, чтобы он заполнил CreateViewModel DayGroup и Department вместе с соответствующими значениями DayGroup и Department.





В вашем представлении есть два тега формы, из-за чего кнопка отправки не распознает все атрибуты в двух формах. Во-вторых, при обработке коллекции Model.Department.Persons вы используете foreach, что может привести к неправильной привязке сервером данных формы к соответствующим атрибутам модели.
Вы можете изменить попытку использования цикла for, чтобы использовать этот индекс для доступа к каждому элементу коллекции, чтобы гарантировать, что сервер сможет распознать соответствующие атрибуты модели при отправке формы. Вот пример для справки, в котором я предоставляю код представления, который настраивает человека типа списка в модели отдела, а модель человека имеет атрибуты Name, set1, set2, set3:
public class CreateGroupViewModel
{
public string AppUserId { get; set; }
public AppUser AppUser { get; set; }
public Department Department { get; set; }
public DayGroup DayGroup { get; set; }
}
public class DayGroup
{
public string Id { get; set; }
public DateTime SubcriptionDate { get; set; }
public Group Group { get; set; }
}
public class AppUser
{
public string Id { get; set; }
public string Name { get; set; }
}
public class Department
{
public string Id { get; set; }
public string DepartmentName { get; set; }
public List<Person> Persons { get; set; }
}
public class Person
{
public string Name { get; set; }
public int Set1 { get; set; }
public int Set2 { get; set; }
public int Set3 { get; set; }
}
}
Вид:
@model CreateGroupViewModel
<div class = "container mb-3">
<div class = "row pt-4">
<div class = "col-6">
<h2 class = "text-primary">
ĐĂNG KÝ ĂN CA CHO TẬP THỂ
</h2>
<h3>
HỌ TÊN: @Model.AppUser.Name
</h3>
<h3>
PHÒNG BAN: @Model.Department.DepartmentName
</h3>
<form method = "post" asp-action = "Create">
<div class = "row g-3 align-items-center">
<div class = "col-auto">
<label for = "SubDate" class = "col-form-label">NGÀY ĐĂNG KÝ: </label>
</div>
<div class = "col-auto">
<input type = "date" id = "SubDate" asp-for = "DayGroup.SubcriptionDate" class = "form-control" />
<span asp-validation-for = "DayGroup.SubcriptionDate" class = "text-dark"></span>
</div>
</div>
<div class = "mb-3 row">
<div class = "col-sm-3">
<input type = "text" readonly class = "form-control-plaintext" value = "DS HỌ TÊN" />
</div>
<div class = "col">
<input type = "text" readonly class = "form-control-plaintext" value = "CA 1" />
</div>
<div class = "col">
<input type = "text" readonly class = "form-control-plaintext" value = "CA 2" />
</div>
<div class = "col">
<input type = "text" readonly class = "form-control-plaintext" value = "CA 3" />
</div>
</div>
@for (int i = 0; i < Model.Department.Persons.Count; i++)
{
<div class = "row">
<div class = "col">
<input type = "text" readonly class = "form-control-plaintext" value = "@Model.Department.Persons[i].Name">
</div>
<div class = "col">
<input class = "form-control" type = "number" asp-for = "Department.Persons[i].Set1" />
<span asp-validation-for = "Department.Persons[i].Set1" class = "text-dark"></span>
</div>
<div class = "col">
<input class = "form-control" type = "number" asp-for = "Department.Persons[i].Set2" />
<span asp-validation-for = "Department.Persons[i].Set2" class = "text-dark"></span>
</div>
<div class = "col">
<input class = "form-control" type = "number" asp-for = "Department.Persons[i].Set3" />
<span asp-validation-for = "Department.Persons[i].Set3" class = "text-dark"></span>
</div>
</div>
}
<div class = "row g-3 align-items-center">
<div class = "col-auto">
<button type = "submit" class = "btn btn-primary">Submit</button>
</div>
<div class = "col-auto">
<a class = "btn btn-danger" asp-controller = "Home" asp-action = "Index">Cancel</a>
</div>
</div>
</form>
</div>
</div>
</div>
После того как я предоставлю соответствующие данные: