我正在尝试实现一个小型Wiki。
我希望用户创建页面,在这些页面中添加部分,并在这些部分中添加内容(部分是一种内容)
我定义了一个非常简单的模型(还有更多模型,以后再讲):
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; }
}
我根据this question about multiple submit buttons
这样定义了我的观点<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]标记为方法,传入参数的模型不包含先前添加的部分。
所以,这就是我的问题:
感谢您的帮助!