【问题标题】:Don't quite understand BeginUmbracoForm不太明白 BeginUmbracoForm
【发布时间】:2017-09-23 16:27:10
【问题描述】:

我正在关注this 教程,使用 Umbraco 和 Mvc 创建一个联系我们的表单 - 我有点不明白为什么某些东西有效。具体来说——ContactForm(局部视图)如何既显示联系我们页面的内容(通过调用@Html.Action("ShowForm", "ContactSurface")),又处理提交按钮(它是如何处理的)知道仅在按下提交按钮时调用 HandleFormPost 吗?)

这是保存“联系我们”网页的视图/模板。

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage<ContentModels.ContactHolder>
@using ContentModels = Umbraco.Web.PublishedContentModels;
@{
    Layout = "Master.cshtml";
}
@Html.Action("ShowForm", "ContactSurface")

这是控制器:

public class ContactSurfaceController : Umbraco.Web.Mvc.SurfaceController
{
    public ActionResult ShowForm()
    {
        ContactModel myModel = new ContactModel();
        return PartialView("ContactForm", myModel);
    }

    public ActionResult HandleFormPost(ContactModel model)
    {
        var newComment = Services.ContentService.CreateContent(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + model.Name, CurrentPage.Id, "ContactFormula");
        newComment.SetValue("emailFrom", model.Email);
        newComment.SetValue("contactName", model.Name);
        newComment.SetValue("contactMessage", model.Message);
        Services.ContentService.SaveAndPublishWithStatus(newComment);
        return RedirectToCurrentUmbracoPage();
    }
}

这是实际显示表单的部分视图,显然还创建了新的 ContactFormula(用于保存联系我们提交的文档类型 - 它包含 emailFrom、contactName 和 contactMessage)。

@inherits Umbraco.Web.Mvc.UmbracoViewPage<ProjectDemo.Models.ContactModel>
@using CohensCigarsDemo.Controllers;
@using (Html.BeginUmbracoForm<ContactSurfaceController>("HandleFormPost"))
{

    <label for="emailFrom">E-mail</label> @Html.TextBoxFor(x => x.Email, new { @class = "emailFrom", placeholder = "E-mail" }) 
    <br />
    <label for="nameFrom">Name</label> @Html.TextBoxFor(x => x.Name, new { @class = "nameFrom", placeholder = "Name" }) 
    <br />
    <label for="messageFrom">Message</label>
    <br />
    @Html.TextAreaFor(x => x.Message, new { @class = "messageFrom", placeholder = "Message" })   

    <br />
    <input type="submit" value="Submit" />
}

【问题讨论】:

    标签: c# asp.net-mvc razor umbraco


    【解决方案1】:

    您的控制器有 2 个方法,1 个用于显示表单 ShowForm,1 个用于在按下提交按钮后执行的业务逻辑 HandleFormPost

    所有的路由信息​​都在下面的语句中

    Html.BeginUmbracoForm<ContactSurfaceController>("HandleFormPost")
    

    Html.BeginUmbracoForm 只是 Razors 自己的 Html.BeginForm 的包装器,带有一些额外的路由功能。

    上面的语句创建了类似的东西

    <form method="post" action="umbraco/surface/contact/handleformpost">
    

    表单现在路由到 ContactSurfaceController 中的 HandleFormPost 方法(这是标准的MVC routing)。 由于提交按钮,浏览器知道点击后该做什么

    ContactModel 只是表单中字段的强类型对象,使用一些 MVC 魔法,当提交表单时,字段会自动映射到 ContactModel 对象,并基于此模型创建新的 umbraco 文档类型使用Services.ContentService.CreateContent

    有关使用 MVC 创建表单的更多说明,请查看this article

    【讨论】:

    • 对不起,我还是不明白。您能否在常规的 BeginForm 上添加更多解释。另外 - 究竟叫什么。具体来说——ContactForm(最后一个 sn-p)在 ShowForm 和 Submit/Handle Form Post 下做什么?
    • 我添加了一些额外的解释以及一个关于如何使用 Razor 创建表单的教程的链接
    猜你喜欢
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多