gpt4 book ai didi

asp.net-mvc - Sitecore MVC - 如何处理页面上的多个表单

转载 作者:行者123 更新时间:2023-12-02 04:37:21 25 4
gpt4 key购买 nike

我一直在研究 Sitecore MVC,但我一直不知道如何处理我的页面有两个 Controller 渲染并且每个都包含一个表单的情况。我希望各个 Controller 能够处理它们的 HttpPost 并在发布后返回整个页面。

我设置了一个简单的示例。两个 Controller 相似:

public class ExampleController : Sitecore.Mvc.Controllers.SitecoreController
{
public override ActionResult Index()
{
return View("Index");
}

[HttpPost]
public ActionResult Index(string formPostData)
{
ViewBag.SaveForLater = formPostData;
return Index();
}
}

View 如下所示:

@using Sitecore.Mvc
@using (Html.BeginRouteForm(Sitecore.Mvc.Configuration.MvcSettings.SitecoreRouteName, FormMethod.Post))
{
@Html.AntiForgeryToken()
var term = ViewBag.SaveForLater as string;
if (!string.IsNullOrEmpty(term))
{
<p>Submitted: @term</p>
}
<p>
@Html.Sitecore().FormHandler("Example", "Index")
<input type="text" name="formPostData" placeholder="Enter something" />
<input type="submit" name="submit" value="Search" />
</p>
}

通过此设置,两个表单都会提交数据,但返回的页面仅包含部分 View ,而不是整个页面。

如果我将行 @Html.Sitecore().FormHandler("Example", "Index") 替换为 @Html.Sitecore().FormHandler()然后返回整个页面,但处理两种表单的 post 操作

这两种情况都不理想。我一定遗漏了一些东西,希望得到指点。

最佳答案

遗憾的是,您可以通过多种方式与 Sitecore MVC 集成,但 Sitecore 并未提供许多最佳实践示例。您可以找到一个示例 here .

在我们的项目中,我们的做法有点不同,因为我们希望尽可能多地使用默认 ASP.NET MVC 中的约定等。我尝试在这篇文章中包含一个完整的简单示例。

我们使用当前操作和当前 Controller 向表单添加两个不同的隐藏字段, View 如下所示:

@model Website.Models.TestViewModel

@using (Html.BeginForm())
{
@Html.LabelFor(model => model.Text)
@Html.TextBoxFor(model => model.Text)

<input type="submit" value="submit" />

<input type="hidden" name="fhController" value="TestController" />
<input type="hidden" name="fhAction" value="Index" />
}

使用这个简单的 ViewModel:

namespace Website.Models
{
public class TestViewModel
{
public string Text { get; set; }
}
}

然后我们创建了一个自定义属性,用于检查当前 Controller /操作是否与发布的相同:

public class ValidateFormHandler : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
var controller = controllerContext.HttpContext.Request.Form["fhController"];
var action = controllerContext.HttpContext.Request.Form["fhAction"];

return !string.IsNullOrWhiteSpace(controller)
&& !string.IsNullOrWhiteSpace(action)
&& controller == controllerContext.Controller.GetType().Name
&& methodInfo.Name == action;
}
}

Controller 操作然后获取新属性:

namespace Website.Controllers
{
public class TestController : Controller
{
public ActionResult Index()
{
return View();
}

[HttpPost]
[ValidateFormHandler]
public ActionResult Index(TestViewModel model)
{
return View(model);
}
}
}

我们始终返回由 ASP.NET MVC 解析的 View 。按照惯例,这是与 Controller 同名的文件夹中的操作同名的 View 。

这种方法对我们来说非常有效。如果您想添加AntiForgeryToken ,这也很好用。

关于asp.net-mvc - Sitecore MVC - 如何处理页面上的多个表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23084196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com