Я пытаюсь реализовать небольшую вики.
Я хочу позволить пользователям создавать страницы, добавлять разделы на эти страницы и контент в эти разделы (раздел представляет собой тип содержимого)
Я определил довольно простую модель (есть немного больше, но это будет позже):
public class Page : IPageContent
{
public string Title { get; set; }
public Guid Id { get; set; }
public List<IPageContent> Contents { get; set; } = new List<IPageContent>();
}
public class Section : IPageContent
{
public Guid Id { get; set; }
public string Title { get; set; }
public List<IPageContent> Contents { get; set; } = new List<IPageContent>();
}
public class HtmlContent : IPageContent
{
public Guid Id { get; set; }
public string Content { get; set; }
}
Я определил свое мнение таким образом, основываясь на этом вопросе о нескольких кнопках отправки
<h2>Create new page</h2>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="ContentPage.Title" class="control-label"></label>
<input asp-for="ContentPage.Title" class="form-control" />
<span asp-validation-for="ContentPage.Title" class="text-danger"></span>
</div>
<div id="sections">
@if (Model != null && Model.ContentPage != null && Model.ContentPage.Contents != null)
{
foreach (var section in Model.ContentPage.Contents)
{
if (section is GuildWikiData.Section)
{
@Html.Partial("CreateSection", section);
}
}
}
</div>
<div class="form-group">
<input type="submit" value="AddSectionToPage" class="btn btn-default" formaction="AddSectionToPage"/>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-default" formaction="Create"/>
</div>
</form>
</div>
</div>
и попытался добавить PartialView для секций, которые будут добавлены:
<section id="@Model.Title" title="@Model.Title">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
<input type="submit" value="AddHtmlContentToSection" class="btn btn-default" formaction="AddHtmlContentToSection"/>
</section>
Наконец, вот мои соответствующие методы в контроллере:
public IActionResult Create()
{
return View("CreateContentPage", new PageViewModel());
}
[HttpPost]
public IActionResult Create(PageViewModel page)
{
page.ContentPage.Id = Guid.NewGuid();
DevelopPages.Add(page.ContentPage);
return Page(page.ContentPage.Id.ToString());
}
[HttpPost]
public IActionResult AddSectionToPage(PageViewModel tempPage)
{
tempPage.ContentPage.Contents.Add(new Section()
{
Id = Guid.NewGuid(),
Title = "Section"
});
return View("CreateContentPage", tempPage);
}
[HttpPost]
public IActionResult AddHtmlContentToSection(PageViewModel tempPage)
{
return View("CreateContentPage", tempPage);
}
Что происходит, когда мой первый вызов Create () работает хорошо, AddSectionToPage () действительно добавляет раздел на мою страницу, и PartialView отображается, но если я пытаюсь сохранить с помощью [HttpPost] Create () или использоватьдругой помеченный метод [HttpPost], модель, переданная в аргументе, не содержит ранее добавленных разделов.
Итак, вот мои вопросы:
- Почему моя модель не отслеживает ранеедобавленные разделы?
- Есть ли лучший способ достичь моей цели?Я хотел бы добавить несколько типов контента, не только необработанный html, но и форматированный текст, изображения, ... чтобы каждый раз предоставлять адаптированные средства управления вводом.
Спасибо за вашу помощь!