2009-07-07 38 views
3

如何在兩個視圖中傳遞ASP.net MVC中的參數,如嚮導?在MVC中傳遞參數的設計建議

或什麼是最好的做法?

我上的bug跟蹤點播應用ASP.net工作被轉移到MVC,我似乎無法撼動的ASPX了我的頭,並在原地打算。

在ASPX應用程序中。

1頁 - >選擇項目,通過專案編號在查詢字符串
第2頁 - >選擇問題類型,通過專案編號和問題類型的查詢字符串
第3頁 - >創建新問題,我們可以得到專案編號和問題類型的形式查詢字符串

我們如何在MVC中重新創建上述流程?

+0

你想用'a'標籤鏈接或表單(可能選擇)元素來做到這一點? – Charlino 2009-07-07 03:14:23

+0

您能否解釋一下使用'a'標籤鏈接或表單的不同之處。 – Picflight 2009-07-07 16:14:32

回答

3

爲「嚮導」型系統的常見做法是使用一個單一的<form>元件,與來自隱藏字段前面的屏幕信息。

編輯:每個請求,這裏是一個例子(我不熟悉ASP.net,所以你必須要轉換成代碼自己:(這)如果你有銷售汽車網站和in。您的訂購表格首先你問的模型車,並在隨後的屏幕爲您提供適用於該車輛的選擇。

<form action="order-wizard.html" method="POST"> 
    <!-- which step of the wizard are we on? --> 
    <input type="hidden" name="step" value="1" /> 
    <!-- Get some info from the user for the first step of the wizard --> 
    <select name="Model"> 
     <option value="Sedan">Sedan</option> 
     <option value="Coup">Coup</option> 
     <option value="Pickup">Pickup</option> 
     <option value="Van">Van</option> 
    </select> 
    <input type="submit" /> 
</form> 

當用戶選擇一個模型並提交形式,order-wizard.html控制器可以注意到的是, step選項是1,並且知道以檢查用戶選擇的模型然後,它生成甘這樣的頁面:(假定用戶選擇了「拾取」)

<form action="order-wizard.html" method="POST"> 
    <!-- which step of the wizard are we on? --> 
    <input type="hidden" name="step" value="2" /> 
    <!-- Stored results from the previous stage of the wizard --> 
    <input type="hidden" name="Model" value="Pickup" /> 
    <!-- Additional information for the wizard. More than one option can be 
     requested for each stage of the wizard. --> 
    <select name="Style"> 
     <option value="Short Bed">Short Bed</option> 
     <option value="Long Bed">Long Bed</option> 
     <option value="Extended Cabin">Extended Cabin</option> 
     <option value="Dually">Dually</option> 
    </select> 
    <select name="Interior"> 
     <option value="Cloth">Cloth</option> 
     <option value="Leather"> Leather </option> 
    </select> 
    <input type="submit" /> 
</form> 

如果嚮導需要收集更多的信息,有可能是通過這種方式隱藏的投入產生額外的頁面。否則,如果這是最後一頁並且收集了所有信息,那麼該頁面的代碼可以像正常一樣處理表單,就好像所有輸入都是由用戶在單個頁面請求中提供的。

這種技術的優點是,服務器並不需要緩存的任何會話信息。另一個優點是它提供了一種RESTful接口,其中來自其他工具的單個頁面請求可以生成表單的所有輸入,跳過中間嚮導頁面。

的缺點是,由於該頁面動態生成基於用戶請求,客戶端都會有,如果他們碰巧導航離開該頁面重新開始。書籤不起作用。它也不會在驗證中保存任何東西,因爲這種表單輸入可能很容易被僞造。

+0

你可以請參考一個例子,說明如何用單個元素

完成這個任務。 – Picflight 2009-07-07 16:15:23

4

我同意TokenMacGuy但有時可能並不可行。

在您將需要在創建自定義的類這種情況下,說你的控制器,你的觀點可以綁定到。然後,在您提交頁面時,您可以使用UpdateModel獲取值並重定向到另一個傳遞給模型的動作,以再次填充更多細節或爲該視圖創建新模型。

讓我們假設你有一個兩個嚮導。這兩個視圖都繼承自<MyApp.Controllers.Wizard>

在你的控制器中你有一個類嚮導,它可能看起來像這樣;

public class Wizard 
{ 
    string FirstName {get;set;} 
    string LastName {get;set;} 
    string eMail {get;set;} 
} 

電子郵件是在你的嚮導的步驟2捕獲。

在步驟1中,您有兩個字段名稱名字和姓氏,並在回發,你只需使用的UpdateModel(嚮導對象)來獲得的值。

這種模式確實現在有一個問題,你需要將整個模型傳遞給View 2,其中包含從視圖1中不需要的數據。在View 2的後面,您再次執行UpdateModel(Wizard對象)以獲得前兩個字段,然後再獲取電子郵件。

第二個視圖中的FirstName和LastName可能位於隱藏字段中。

這是1種方式,現在真的不是我在屏幕上看到的最好的。您可以將每一步都保存到狀態服務中,這樣您就不會每次都傳回所有數據,這會使數據更清潔。

JamesShannon的想法也很棒。除非你在網上購買,否則奇才非常過時。

您可以做的是使用JavaScript來隱藏和顯示嚮導的元素,以便所有輸入字段位於同一頁面上。如果您在完成前一部分時使用滾動動畫來打開下一部分,這可能非常有效。 < =希望有道理。

<script src="/Scripts/jquery-1.3.2.js"></script> 
    <script> 
     $(document).ready(function() { 

      $("#addComment").click(function() { 
      if ($("#divStep2").is(':visible')) { 
       $("#divStep2").slideUp(300); 
      } else { 
      $("#divStep2").slideDown(300); 
       } 
      }); 

     }); 
    </script> 

上面的代碼會在您點擊它時切換開啓和關閉部分的動畫。這確實要求JS在客戶端機器上處於活動狀態,因此您可能希望默認情況下打開所有部分,然後使用JS在頁面輸入時關閉它們。

,如果你這樣做,那麼如果用戶確實有JS,他們會看到漂亮的動畫,如果沒有的話,他們將至少仍然可以看到所有部分,生活就會好。

JS是我認爲你不需要無關的數據傳遞給每個視圖的最佳方法,你不需要將數據保存了一些國家的服務,你可能需要清理,如果人們只需點擊遠離您的網站1/2路。

希望這會有所幫助。

+0

是的,樣品會非常有幫助。 – Picflight 2009-07-07 13:37:53

0

就個人而言,我更喜歡griegs'的解決方案。我自己做了這個,它更乾淨。此外,當需求發生變化,並有可以來回移動的頁面之間,或保存狀態,稍後再回來的請求,則該模型是唯一的出路。

但是...如果你的例子是不做作,你的精靈真的是象你所說的那麼簡單,那麼我建議:

一)重新考慮你的第3頁嚮導想法。四年前,這將是一條路要走,但現在我們有AJAX。將它合併到一個頁面上。

B)做不到這一點......通過表單傳遞2個變量(我喜歡這裏查詢字符串)。

詹姆斯