我一直在寻找Sitecore MVC但我仍然坚持如何处理我的页面有两个控制器渲染并且每个包含一个表单的情况.我希望各个控制器处理他们的HttpPost并在发布后返回整个页面.
我已经建立了一个简单的例子.两个控制器类似:
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(); } }
视图看起来像这样:
@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> }
使用此设置,两个表单都提交其数据,但返回的页面仅包含部分视图,而不是整个页面.
如果我用@ Html.Sitecore().FormHandler()替换@ Html.Sitecore().FormHandler(“Example”,“Index”)行,则返回整个页面,但处理两个表单的post动作.
这两种情况都不理想.我必须遗漏一些东西,并会欣赏指针.
解决方法
不幸的是,有多种方法可以与Sitecore MVC集成,而Sitecore没有提供许多最佳实践示例.一个例子你可以找到
here.
在我们的项目中,我们做的有点不同,因为我们希望尽可能多地使用默认ASP.NET MVC中的约定等.我试着在这篇文章中包含一个完整的简单例子.
我们使用当前操作和当前控制器向表单添加两个不同的隐藏字段,视图如下所示:
@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; } } }
然后我们创建了一个自定义属性,用于检查当前控制器/操作是否与发布的相同:
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; } }
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解析的视图.按照惯例,这是与文件夹中具有与控制器同名的操作同名的视图.