ASP.Net Core添加项目并在模型集合中进行编辑

时间:2019-06-12 16:32:51

标签: c# asp.net-core razor

我正在尝试实现一个小型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]标记为方法,传入参数的模型不包含先前添加的部分。

所以,这就是我的问题:

  • 为什么我的模型不跟踪以前添加的部分?
  • 有没有更好的方法可以实现我的目标?我想添加几种类型的内容,不仅是原始的html,还包括格式化的文本,图像等等,以便每次都提供经过调整的输入控件。

感谢您的帮助!

0 个答案:

没有答案