2015-02-23 102 views
3

我正在開發使用sitecore和mvc的多步驟形式。在每個步驟中,我需要sitecore上下文,並使用相同的控制器渲染。現在作爲sitecore的作品,我需要爲我的渲染添加控制器名稱和動作,所以基本上我只能對每個渲染使用一個控制器動作。Sitecore MVC多步驟形式

在我的情況下,我使用了相同的動作名稱,但不同的參數類型爲多步驟形式的每一步。理想情況下,我想爲多步驟形式中的每個步驟使用不同的控制器操作名稱。任何人都可以幫助我嗎?

謝謝

+0

嗨,我不知道網站核心比它是一個CMS,但如果我在另一個CMS有類似的問題,我想我會寫一些MVC路由規則。現在你可以說這個{前綴}/{控制器}/{動作}去到這個特定的控制器/動作。這可能是一個解決方案嗎? – Andreas 2015-02-23 09:07:51

+0

嗨安德烈亞斯。感謝您的回覆,但這很多不起作用。正如我在文章中提到的,我還需要在我的操作中提供Sitecore上下文。 – 2015-02-23 10:37:46

回答

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; 
} 

在上面的例子中,我假設你已經確定了某種模型對象,在那裏你可以在任何你需要的參數,使您的視圖可以通過用它來渲染。

如果您使用的是不同的視圖,那麼您只需爲每個操作返回一個不同的視圖,再將一個模型傳遞給視圖以幫助渲染。

+0

Jay。你非常接近。我確實有相同的控制器渲染和返回不同部分視圖的操作的不同重載。由於在控制器渲染中我必須指定動作名稱,Sitecore上下文只在該動作中可用,而我想要的是對同一控制器渲染中的每個步驟單獨執行動作。 – 2015-02-23 11:40:56

+0

如果你必須使用相同的控制器渲染(我假設是因爲演示文稿的細節),那麼你將只能定義一個可以被觸發的動作。 也就是說,在您的控制器操作中,您可以輕鬆地將其委託給其他方法,並根據您從上下文中提取的參數或信息將您的操作方法分解爲多個方法。 如果您希望多個操作具有不同視圖,那麼您可能需要多個控制器呈現。將它們全部添加到頁面中,並讓它們各自的控制器加載「空白」視圖,如果它們當前不需要的話。 – 2015-02-23 13:34:56

0

如果您正在使用AJAX(我將承擔)我想提出以下建議:

  1. 採用了獨特的HTTPGET動作控制器
  2. 代表服務您的多步驟形式的每個視圖/步每個視圖/步驟的形式與一個獨特的項目和一個獨特的視圖(分配的意見的項目和使用空的佈局,使表格/視圖自己渲染)
  3. 處理每個窗體的後操作在您的控制器中獨特的HttpPost動作
  4. 從HttpPos t動作,返回一個可以在客戶端處理的JSON對象。包含在這個結果中的屬性,如成功,失敗,驗證錯誤和下一步要顯示的表單(以下AJAX請求的URL--稱爲此屬性NextStepUrl
  5. 在您的客戶端JavaScript中有一個函數可以處理由控制器的POST操作返回的JSON結果對象。如果成功讀取NextStepUrl屬性然後使用此爲形式的下一步執行AJAX GET請求

這種方法意味着每個GET請求,你會從其中一個有效RenderingContext讀取控制器渲染的數據源。

如果您需要在HttpPost操作期間擁有RenderingContext,您可以簡單地在數據源項目的ID中包含一個隱藏字段,並在HttpPost操作中讀取它,或者可以使用一些custom model binding來實現同一事物稍微清潔的方式。