如何在兩個視圖中傳遞ASP.net MVC中的參數,如嚮導?在MVC中傳遞參數的設計建議
或什麼是最好的做法?
我上的bug跟蹤點播應用ASP.net工作被轉移到MVC,我似乎無法撼動的ASPX了我的頭,並在原地打算。
在ASPX應用程序中。
1頁 - >選擇項目,通過專案編號在查詢字符串
第2頁 - >選擇問題類型,通過專案編號和問題類型的查詢字符串
第3頁 - >創建新問題,我們可以得到專案編號和問題類型的形式查詢字符串
我們如何在MVC中重新創建上述流程?
如何在兩個視圖中傳遞ASP.net MVC中的參數,如嚮導?在MVC中傳遞參數的設計建議
或什麼是最好的做法?
我上的bug跟蹤點播應用ASP.net工作被轉移到MVC,我似乎無法撼動的ASPX了我的頭,並在原地打算。
在ASPX應用程序中。
1頁 - >選擇項目,通過專案編號在查詢字符串
第2頁 - >選擇問題類型,通過專案編號和問題類型的查詢字符串
第3頁 - >創建新問題,我們可以得到專案編號和問題類型的形式查詢字符串
我們如何在MVC中重新創建上述流程?
爲「嚮導」型系統的常見做法是使用一個單一的<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接口,其中來自其他工具的單個頁面請求可以生成表單的所有輸入,跳過中間嚮導頁面。
的缺點是,由於該頁面動態生成基於用戶請求,客戶端都會有,如果他們碰巧導航離開該頁面重新開始。書籤不起作用。它也不會在驗證中保存任何東西,因爲這種表單輸入可能很容易被僞造。
你可以請參考一個例子,說明如何用單個元素
我同意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路。
希望這會有所幫助。
是的,樣品會非常有幫助。 – Picflight 2009-07-07 13:37:53
就個人而言,我更喜歡griegs'的解決方案。我自己做了這個,它更乾淨。此外,當需求發生變化,並有可以來回移動的頁面之間,或保存狀態,稍後再回來的請求,則該模型是唯一的出路。
但是...如果你的例子是不做作,你的精靈真的是象你所說的那麼簡單,那麼我建議:
一)重新考慮你的第3頁嚮導想法。四年前,這將是一條路要走,但現在我們有AJAX。將它合併到一個頁面上。
B)做不到這一點......通過表單傳遞2個變量(我喜歡這裏查詢字符串)。
詹姆斯
對於特定向導的情況,有一個非常酷的JQuery的嚮導插件可以在這裏找到:
http://blog.jerodsanto.net/2008/08/jquery-wizard-redux/
演示是在這裏:
你想用'a'標籤鏈接或表單(可能選擇)元素來做到這一點? – Charlino 2009-07-07 03:14:23
您能否解釋一下使用'a'標籤鏈接或表單的不同之處。 – Picflight 2009-07-07 16:14:32