不太明白BeginUmbracoForm
Don't quite understand BeginUmbracoForm
我正在学习 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" />
}
您的控制器有 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
我正在学习 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" />
}
您的控制器有 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