Asp.net mvc 4 Sitecore MVC控制器和表单-ActionResult在回发时不呈现布局

Asp.net mvc 4 Sitecore MVC控制器和表单-ActionResult在回发时不呈现布局,asp.net-mvc-4,sitecore,glass-mapper,Asp.net Mvc 4,Sitecore,Glass Mapper,Sitecore 7.1v1,最新的玻璃贴图器,MVC4。当我们提交表单POST时,返回视图没有布局。我不想重定向到另一个页面,因为这应该是一种类似于向导的体验。这也足够轻量级,不需要Ajax,尽管我们可以将其用作最后手段。我找不到谁来确保在返回视图时我们也能得到布局。我是Sitecore MVC的新手,一般来说,我对MVC非常陌生。引用的PageBase是使用玻璃的自定义模型 我们有以下控制器渲染: public class RegistrationController : Controlle

Sitecore 7.1v1,最新的玻璃贴图器,MVC4。当我们提交表单POST时,返回视图没有布局。我不想重定向到另一个页面,因为这应该是一种类似于向导的体验。这也足够轻量级,不需要Ajax,尽管我们可以将其用作最后手段。我找不到谁来确保在返回视图时我们也能得到布局。我是Sitecore MVC的新手,一般来说,我对MVC非常陌生。引用的PageBase是使用玻璃的自定义模型

我们有以下控制器渲染:

public class RegistrationController : Controller
{
    [HttpGet]
    public ActionResult VerifyAccount()
    {

        return View("~/Views/Public/Wizards/Registration/VerifyAccount.cshtml",
            new SitecoreContext().GetCurrentItem<PageBase>());
    }
    [HttpPost]
    public ActionResult CreateProfile()
    {
        ViewBag.Name = Request["VerificationType"];
        ViewBag.Step = 2;
        return View("~/Views/Public/Wizards/Registration/CreateProfile.cshtml",
            new SitecoreContext().GetCurrentItem<PageBase>());
    }
}
公共类注册控制器:控制器
{
[HttpGet]
公共行动结果验证帐户()
{
返回视图(“~/Views/Public/Wizards/Registration/VerifyAccount.cshtml”,
新建SitecoreContext().GetCurrentItem());
}
[HttpPost]
公共操作结果CreateProfile()
{
ViewBag.Name=请求[“验证类型”];
步骤=2;
返回视图(“~/Views/Public/Wizards/Registration/CreateProfile.cshtml”,
新建SitecoreContext().GetCurrentItem());
}
}
此操作的默认操作是VerifyAccount()。这将按预期呈现。初步意见如下:

 @inherits Glass.Mapper.Sc.Web.Mvc.GlassView<Public.Model.GlassModel.Primary.PageBase>

<div>
<h3>@Editable(a => a.Title)</h3>
<p>
    @Editable(a => a.Description)
</p>
<hr />
@using (Html.BeginRouteForm(Sitecore.Mvc.Configuration.MvcSettings.SitecoreRouteName, FormMethod.Post))
{
    @Html.Sitecore().FormHandler("Registration", "CreateProfile")
    @Html.ValidationSummary(true, "Verification Not Selected.")
    <fieldset>
        @Sitecore.Globalization.Translate.Text("$Registration.VerificationTitle")
        @{ var validations = new SitecoreContext().GetItem<GlassFrameBase>(Guid.Parse("{3694FC43-3DB7-470A-A1E9-2649856AAF10}"));}
        <select id="VerType" name="VerificationType">
            @foreach (var validation in validations.GetChildren<VerificationMethod>())
            {
                <option value="@validation.MethodValue">@validation.MethodName</option>
            }
        </select>
        <input type="submit" value="Next" />
    </fieldset>
}
@using (Html.BeginRouteForm(Sitecore.Mvc.Configuration.MvcSettings.SitecoreRouteName, FormMethod.Post))
{
@Html.Sitecore().FormHandler()
<p>
    <b>Verification Type Was: </b>@ViewBag.Name
</p>
<p>@ViewBag.Step</p>
<input type="hidden" value="ThisIsATest" name="TestHidden" id="TestHidden"/>
<input type="submit" name="back" value="Back" /><br />
<input type="submit" name="next" value="Next" />
}
@继承Glass.Mapper.Sc.Web.Mvc.GlassView
@可编辑(a=>a.Title)

@可编辑(a=>a.Description)


@使用(Html.BeginRouteForm(Sitecore.Mvc.Configuration.MvcSettings.SitecoreRouteName,FormMethod.Post)) { @Html.Sitecore().FormHandler(“注册”、“创建配置文件”) @ValidationSummary(true,“未选择验证”) @Sitecore.Globalization.Translate.Text(“$Registration.VerificationTitle”) @{var validations=new SitecoreContext().GetItem(Guid.Parse({3694FC43-3DB7-470A-A1E9-2649856AAF10});} @foreach(validations.GetChildren()中的var验证) { @validation.MethodName } }

这将发回CreateProfile()方法。这部分很好用。唯一的问题是,当它这次返回视图时,它只返回没有布局的视图

最后的意见如下:

 @inherits Glass.Mapper.Sc.Web.Mvc.GlassView<Public.Model.GlassModel.Primary.PageBase>

<div>
<h3>@Editable(a => a.Title)</h3>
<p>
    @Editable(a => a.Description)
</p>
<hr />
@using (Html.BeginRouteForm(Sitecore.Mvc.Configuration.MvcSettings.SitecoreRouteName, FormMethod.Post))
{
    @Html.Sitecore().FormHandler("Registration", "CreateProfile")
    @Html.ValidationSummary(true, "Verification Not Selected.")
    <fieldset>
        @Sitecore.Globalization.Translate.Text("$Registration.VerificationTitle")
        @{ var validations = new SitecoreContext().GetItem<GlassFrameBase>(Guid.Parse("{3694FC43-3DB7-470A-A1E9-2649856AAF10}"));}
        <select id="VerType" name="VerificationType">
            @foreach (var validation in validations.GetChildren<VerificationMethod>())
            {
                <option value="@validation.MethodValue">@validation.MethodName</option>
            }
        </select>
        <input type="submit" value="Next" />
    </fieldset>
}
@using (Html.BeginRouteForm(Sitecore.Mvc.Configuration.MvcSettings.SitecoreRouteName, FormMethod.Post))
{
@Html.Sitecore().FormHandler()
<p>
    <b>Verification Type Was: </b>@ViewBag.Name
</p>
<p>@ViewBag.Step</p>
<input type="hidden" value="ThisIsATest" name="TestHidden" id="TestHidden"/>
<input type="submit" name="back" value="Back" /><br />
<input type="submit" name="next" value="Next" />
}
@使用(Html.BeginRouteForm(Sitecore.Mvc.Configuration.MvcSettings.SitecoreRouteName,FormMethod.Post))
{
@Html.Sitecore().FormHandler()

验证类型为:@ViewBag.Name

@视图包。步骤


}

其他一切都完全按照预期工作,但我缺少了一些在回程中加载布局的重要内容。

尝试将CreateProfile的返回类型从
ActionResult
更改为
PartialViewResult
,然后将
返回视图(“…
更改为
返回PartialView(“…

另外,这里有一篇关于Sitecore控制器渲染可以返回的内容的帖子。


我还没有深入地考虑过用控制器渲染的表单发布,但是如果上面的建议不起作用,那么可以考虑在SITECORE MVC中使用的执行方式(在帖子中提到)。“…到

返回部分视图(…

另外,这里有一篇关于Sitecore控制器渲染可以返回的内容的帖子。


我没有用控制器渲染来深入研究窗体发布,但是如果上面的建议不起作用,那么可以考虑在SITECORE MVC中使用的执行方式(在帖子中提到)。

我也注意到了这一点,我认为它与这条线有关:

@Html.Sitecore().FormHandler("Registration", "CreateProfile")
它似乎绕过了标准的渲染管道,只调用了目标操作。我写了一篇博客文章,介绍了如何在多个控制器上控制对不同操作的调用。这可能会有所帮助:


我以前也注意到了这一点,我认为这与这一行有关:

@Html.Sitecore().FormHandler("Registration", "CreateProfile")
它似乎绕过了标准的渲染管道,只调用了目标操作。我写了一篇博客文章,介绍了如何在多个控制器上控制对不同操作的调用。这可能会有所帮助:


这是您的答案。您需要发布到Sitecore项目,而不是MVC操作。我会去掉BeginRouteForm和FormHandler的内容,只在那里放置一个指向定义布局的Sitecore项目的标记。然后使用Michael的解决方案将多个操作应用到一个项目。非常好。完美,这正是我需要的。谢谢!这是你的答案。你需要发布到一个Sitecore项目,而不是MVC操作。我会去掉BeginRouteForm和FormHandler的东西,只在那里放一个指向定义布局的Sitecore项目的点。然后使用Michael的解决方案将多个操作应用到一个项目。效果很好。完美,这正是我需要的。谢谢!谢谢,我也会看这个。我已经将迈克的回答标记为答案,但是+1也会看这个,因为这是好信息。谢谢,我也会看这个。我已经将迈克的回答标记为答案,但是+1也会看这个,因为这是好信息。