[英]Handling Parameters of ASP.NET MVC Application
我正在研究我們公司的ASP.NET MVC 4項目。 它是基於收入的應用程序,它在應用程序的每個控制器和操作處都有一些過濾器,它們像某些過濾器一樣是Year和Quarter。 對於這些過濾器更改,我使用了Create Base Model(它包含這些過濾器值),並且所有其他模型都繼承自此Base Model.Base Model用於@layout視圖。 過濾器的每次更改都應更新視圖。 布局視圖中的基本模型是這樣的
public class BaseModel
{
public string YearSelected{ get; set;}
public string QuarterSelected{ get; set;}
}
和其他模型都從此BaseModel繼承
public class RevenueModel:BaseModel
{
// other stuff
}
對於所有這些事情,我正在通過參數發送。似乎像現在這樣參數是增加需求是更改以添加更多參數
1.我想知道處理正確的方法,如果方法不足,建議我處理此參數更改的最佳方法。
2.在UI(視圖)中,
當用戶通過單選按鈕更改視圖並單擊“應用過濾器”按鈕時,我正在使用jquery來處理此問題,
window.href='Url Action with new Parameters';
window.href='@Url.Action("SomeAction","Controller",new{ // those all parameters } ';
當單擊按鈕window.href將自動調用並更新我想知道的視圖
這種方法健壯嗎? 建議我處理這種情況的最佳方法。
“如果我使用jquery來調用操作並為調用控制器操作使用大量參數,那么我就需要一個答案”
您正在執行的操作是可行的,但是正如@ ps2goat指出的那樣,如果URL中的GET參數過多,則會遇到問題。
但是正確的答案取決於如何使用過濾器。 用戶會經常更換過濾器還是很少更換過濾器? 如果希望用戶瀏覽您的應用程序並且僅很少更改過濾器,我建議您使用另一種方法,而不是將參數作為GET參數包含在URL中,因為:
/controller/action/?YearSelected=2014&QuarterSelected=1&Parameter3=2&Parameter4=8
,這也可能會產生您需要解決的SEO問題。 在這種情況下,建議您考慮使用Cookie或將用戶的過濾器保存在服務器上。 (但最好不在會話中,因為那樣會為您的應用程序帶來可伸縮性問題)。 如果您使用Cookie,則用戶的過濾器將可自動用於每個請求的Controller Action,因為cookie將與每個請求一起發送。 (考慮使用哪種策略時,當然也要牢記這一點。如果您有很多cookie數據,這將減慢應用程序的感知響應速度,因為cookie數據必須與每個請求一起發送給您的服務器。因此,請保持您的Cookie數據盡可能小)
另一方面,如果您希望用戶經常甚至在同一頁面上多次更改過濾器,則可以考慮使用jQuery對MVC控制器進行異步POST,使用JSON檢索必要的數據,並更新視圖。 實際上,這並不像聽起來那樣困難。
實現它所需要做的是在頁面上創建一個Javascript函數,該函數將參數提交給控制器操作。 您也可以將數據作為JSON發送到控制器操作。 這樣的事情可能會起作用:( 未經測試的代碼 )
<script>
function submitFilters() {
var parameters = {
parameter1: $('#parameter1').val(),
parameter2: $('#parameter2').val(),
...
};
$.ajax('@Url.Action("SomeController", "SomeAction")', {
contentType: 'application/json',
data: JSON.stringify(parameters),
success: function(data) {
alert('Received data back from server. Ready to update the view.');
}
};
}
</script>
然后,您將掛接過濾器(單選按鈕,下拉列表等)以調用方法submitFilters
。
只要屬性名稱匹配,MVC就會自動將從客戶端接收到的JSON數據轉換為C#ViewModel。 然后,您可以在服務器上執行所需的任何查詢和篩選,然后將數據作為操作的結果發送回去。 ( 偽代碼 )
public ActionResult SomeAction(MyViewModel vm)
{
var data = SomeRepository.GetData(vm.Parameter1, vm.Parameter2, ...);
return Json(data);
}
然后,您只需要在接收到數據時更新視圖。 您最好為此使用模板引擎,但是當然不是必需的。
這只是如何做到的粗略示例。 通常,我會創建一個Knockout視圖模型來封裝所有視圖。 但這應該可以幫助您入門。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.