【问题标题】:Sitecore MVC multi step formSitecore MVC 多步骤表单
【发布时间】:2015-02-23 08:47:52
【问题描述】:

我正在使用 sitecore 和 mvc 开发多步骤表单。在每个步骤中,我都需要 sitecore 上下文,并且我正在使用控制器渲染。现在随着 sitecore 的工作,我需要为我的渲染添加控制器名称和操作,所以基本上我只能为每次渲染使用一个控制器操作。

在我的例子中,我为多步骤形式的每个步骤使用了相同的动作名称但不同的参数类型。理想情况下,我希望多步骤表单中的每个步骤都有不同的控制器操作名称。谁能帮我解决这个问题?

谢谢

【问题讨论】:

  • 嗨,我对 Site Core 的了解并不多于它是一个 CMS,但如果我在另一个 CMS 中遇到类似问题,我想我会编写一些 MVC 路由规则。现在你可以说这个 {prefix}/{controller}/{action} 转到这个特定的控制器/动作。有没有办法解决?
  • 你好安德烈亚斯。感谢您的回复,但很多都不起作用。正如我在帖子中提到的,我还需要在我的操作中使用 Sitecore 上下文。

标签: model-view-controller sitecore sitecore-mvc


【解决方案1】:

我不确定我是否完全理解了这个问题。您是否尝试对所有步骤使用单个 .cshtml 文件?如果是这样,您可以在 Sitecore CMS 中为同一视图定义多个控制器渲染。在渲染部分,将多步骤表单的每个步骤定义为单独的控制器渲染。您可以为每个控制器使用相同的控制器,但指定不同的操作。

在您的控制器逻辑中,您可以指定返回相同的视图,但将不同的属性传递给您的模型对象。

例如,您可能会这样做:

public ActionResult Step2(){
   var context = RenderingContext.Current.PageContext.Item;
   var otherParams = "SomethingForStep2";
   var model = new MyModelObject(context, otherParams);
   var view = this.View("Path/To/My/View", model);

   return view;
}

在上面的示例中,我假设您已经定义了某种模型对象,您可以在其中传递您需要的任何参数,以便您的视图可以使用它进行渲染。

如果您使用不同的视图,那么您将为每个操作返回不同的视图,再次将模型传递给视图以帮助其渲染。

【讨论】:

  • 杰伊。你很亲密。我确实有相同的控制器渲染和返回不同局部视图的不同动作重载。由于在控制器渲染中我必须指定动作名称,Sitecore 上下文仅在该动作中可用,我想要的是在同一控制器渲染中为每个步骤单独操作。
  • 如果你必须使用相同的控制器渲染(我假设是因为演示细节),那么你将只定义一个可以触发的动作。话虽如此,在您的控制器操作中,您可以轻松地委托给其他方法,并根据您从上下文中提取的参数或信息将您的操作方法分解为多个方法。如果您想要具有不同视图的多个操作,您可能需要多个控制器渲染。将它们全部添加到页面中,如果当前不需要它们,则让它们各自的控制器加载“空白”视图。
【解决方案2】:

如果您使用的是 AJAX(我会假设),我会推荐以下内容:

  1. 使用控制器中的独特 HttpGet 操作为多步骤表单的每个视图/步骤提供服务
  2. 用唯一的项目和唯一的视图表示表单的每个视图/步骤(将视图分配给项目并使用空布局以使表单/视图能够自行呈现)
  3. 在您的控制器中使用唯一的 HttpPost 操作处理每个表单的发布操作
  4. 从 HttpPost 操作返回一个可以在客户端处理的 JSON 对象。在此结果中包含成功、失败、验证错误等属性以及要显示的表单的下一步(以下 AJAX 请求的 URL - 调用此属性NextStepUrl
  5. 在您的客户端 JavaScript 中有一个函数来处理控制器的 POST 操作返回的 JSON 结果对象。如果成功读取NextStepUrl 属性,则使用它为表单的下一步执行 AJAX GET 请求

这种方法意味着在每个 GET 请求上,您都将拥有一个有效的 RenderingContext,可以从中读取控制器渲染的数据源。

如果您需要在 HttpPost 操作期间使用 RenderingContext,您可以简单地包含一个带有数据源项 ID 的隐藏字段并在 HttpPost 操作中读取它,或者您可以使用一些 custom model binding 在一种更清洁的方式。

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多