不太了解BeginUmbracoForm

时间:2017-09-23 16:27:10

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

我正在关注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" />
}

1 个答案:

答案 0 :(得分:2)

您的控制器有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 documenttype是使用Services.ContentService.CreateContent

创建的

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