Я создаю что-то вроде контроллера древовидного представления с рекурсивными вызовами для рендеринга форм с возможностью добавления новых узлов и т. Д. Дерево рендерится с помощью компонента представления, который вызывается с "домашнего" сайта, который имеет дополнительные элементы, которые не должны бытьзатронуты рекурсивными вызовами из этого компонента представления. "SeededCategories" - это просто класс, который помогает отображать древовидное представление для категорий (идея для этого взята из ASP.NET MVC 4, создающего древовидное представление с рекурсивным частичным представлением ), вот как выглядят оба класса:
public class SeededCategories
{
public int? Seed { get; set; }
public IOrderedEnumerable<Category> Categories { get; set; }
}
public class Category
{
[Required(ErrorMessage = "Field ID is required")]
public int ID { get; set; }
public int? Parent_ID { get; set; }
[Required]
[MinLength(3, ErrorMessage = "Name must be longer than 3 characters.")]
public string Name { get; set; }
}
И вот так выглядит компонент представления данных (проще говоря, результатом является просто список с категориями)
public class DataViewComponent : ViewComponent {
public IViewComponentResult Invoke()
{
SeededCategories model = new SeededCategories { Seed = null, Categories = result };
return View("DataIndex", model);
}
}
Это вызов с домашней страницы для этого представления «данных»Компонент (я использую @model Category
из-за таких вещей, как переключение двух узлов, что происходит в домашнем представлении).
@model Category
@await Component.InvokeAsync("Data")
Это представление для этого компонента представления с рекурсивными вызовами (каждый узел имеет форму для добавления дочернего элемента):
@model SeededCategories
@if (Model.Categories.Where(s => s.Parent_ID == Model.Seed).Any())
{
<ul>
@foreach (var node in Model.Categories)
{
if (node.Parent_ID == Model.Seed)
{
SeededCategories inner = new SeededCategories { Seed = node.ID, Categories = Model.Categories };
<li>
<form asp-controller="Home" asp-action="AddNode" asp-route-parent="@node.ID" method="post">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<input asp-for="@node.Name" name="Name" placeholder="Add child" />
<span asp-validation-for="@node.Name"></span>
</div>
<button type="submit" class="btn btn-primary">Add Child</button>
</form>
@Html.Partial("Components/Data/DataIndex", inner)
</li>
}
}
</ul>
}
И последняя часть этого процесса, AddNode
действие от Home
контроллера, который просто получает категории Name
и ID
из формы, добавляет материал в базу данных и перенаправляет на Home
действие, которое не выполняет ничего, кроме визуализации Home
представления.
[HttpPost]
public IActionResult AddNode(int parent, Category category)
{
if (!ModelState.IsValid)
{
return RedirectToAction("home");
}
category.Parent_ID = parent;
_dataRepository.AddNode(category);
return RedirectToAction("home");
}
}
И есть проблема: есть ли способ показать ошибки проверки в моем Data
View Component (яn, который у меня есть формы с входами) при перенаправлении на Home
действие (которое имеет вызов для этого компонента просмотра). Я новичок в .net вещи, может быть, есть другой способ показать эти ошибки проверки (они могут также отображаться в представлении Home
, в верхней части вызова для компонента просмотра).