Нужен совет о правильном подходе к следующему сценарию.
У меня есть три класса моделей:
namespace App.Models
{
public partial class Company
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
}
public partial class Department
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
public int CompanyID { get; set; }
public Company Company { get; set; };
}
public partial class User
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
public int Department { get; set; }
public Department Department { get; set; };
}
}
Когда я получаю доступ к представлению «Создать» UserController
, у меня есть поле со списком для выбора DepartmentID
.
Проблема в том, что список слишком велик. Я хотел бы добавить в представление список для выбора Company
. А в поле со списком Department
должны появиться только Department
внутри выбранного Company
.
Есть какие-нибудь советы о том, как правильно этого добиться? Я уже знаю, как фильтровать Department
по Company
в пакете просмотра.
Но я не знаю, как внести изменения в представление и отправить фильтр контроллеру.
Заранее спасибо.
@MdFaridUddinKiron Я использую .NET 7.0. Я попробую это сделать. До сих пор мне это не приходило в голову, так как я понимал, что всю логику нужно писать в контроллерах, а не во представлениях. Я посмотрю, смогу ли я сделать это таким образом.
Есть какие-нибудь советы о том, как правильно этого добиться? я уже знаю как отфильтруйте отделы по компаниям в пакете просмотра.
Но я не знаю, как внести изменения в представление и отправить фильтр к контроллеру
Ну, во-первых, загрузите свою компанию в поле зрения. Все, что вам нужно сделать, это запросить объект вашей компании и привязать его к ViewBag. Вы можете сделать следующее:
ViewBag.Companies = _context.Companies.ToList();
Внутри представления у вас должен быть следующий код:
<div class = "form-group">
<label asp-for = "CompanyId" class = "control-label"></label>
<select asp-for = "CompanyId" class = "form-control" onchange = "getDepartments(this.value)">
<option value = "">Select Company</option>
@foreach (var company in ViewBag.Companies)
{
<option value = "@company.ID">@company.Name</option>
}
</select>
</div>
Теперь, чтобы загрузить отдел на основе выбранной компании, вам необходимо получить идентификатор компании, а затем вызвать API для получения отдела на основе переданного идентификатора компании. Используйте запрос ajax для реализации этого.
Вы можете сделать следующее:
<div class = "form-group">
<label asp-for = "DepartmentId" class = "control-label"></label>
<select asp-for = "DepartmentId" id = "departmentDropdown" class = "form-control">
<option value = "">Select Department</option>
</select>
</div>
Скрипт:
<script>
function getDepartments(companyId) {
$.ajax({
url: '/User/GetDepartments',
type: 'GET',
data: { companyId: companyId },
success: function (data) {
$('#departmentDropdown').empty();
$.each(data, function (i, department) {
$('#departmentDropdown').append($('<option>').text(department.name).attr('value', department.id));
});
}
});
}
</script>
Контроллер:
public IActionResult GetDepartments(int companyId)
{
var departments = _context.Departments.Where(d => d.CompanyID == companyId).ToList();
return Json(departments);
}
Примечание. Убедитесь, что URL-адрес запроса ajax указывает на ваш контроллер соответственно.
Для меня это сотворило чудеса. Что меня блокировало, так это часть запроса AJAX, я не до конца понимал поток данных. Благодаря вашему примеру я уже смог реализовать его в остальной части моего проекта. Большое спасибо, чувак.
Галд, чтобы помочь вам в этом.
Чтобы фильтровать отделы на основе выбора компании в представлении создания ASP.NET MVC, используйте AJAX. Добавьте раскрывающиеся списки компаний и отделов. Используйте Javascript для запуска запроса AJAX при смене компании, отправляя идентификатор новому действию контроллера. Это действие фильтрует отделы по идентификатору компании, возвращая данные JSON, которые заполняют раскрывающийся список отделов в обратном вызове успешного выполнения Javascript представления. Кстати, какую версию .NET вы используете?