asp.net-mvc – Sitecore MVC – 如何在页面上处理多个表单
|
我一直在寻找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解析的视图.按照惯例,这是与文件夹中具有与控制器同名的操作同名的视图. 这种方法对我们非常有效.如果你想添加 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 如何知道为什么IIS应用程序池被回收
- ef-code-first – 如何使用LocalDB和EF,而不使用迁移
- asp.net – 从wsdl生成webservice
- 获取当前的ASP.NET机器密钥
- asp.net – 如何在VB.NET中JSON编码数组?
- asp.net-mvc – 返回ASP.Net Core MVC中的上一页
- asp.net-mvc – 升级到Visual Studio 2015会使intellisense
- ASP.Net的最佳免费文件管理器
- asp.net-core – 哪些所有类型的HTTP头都在ASP.NET 5中?
- asp.net – WebForms:MasterPages中的动态(或绝对)脚本标记
- asp.net-mvc – 我们可以为ASP.NET MVC 5中的角色
- asp.net-web-api – 返回Web API中的错误
- 你在ASP.NET MVC视图中编写JavaScript吗?还是在
- asp.net-mvc – ASP.NET MVC – Html.DropDownLi
- asp.net-mvc – MVC3:当我想从控制器访问模型数
- asp.net-mvc – 从页面到局部视图的asp.net mvc参
- asp.net – 如何为客户端和服务器缓存设置不同的
- asp.net-web-api – 在ASP.NET Core Web API中实
- .net – 扩展自定义成员资格提供程序
- asp.net-mvc – 属性路由和本地化问题
