2013-10-13 49 views
2

我正在使用本公司的ASP.NET MVC 4項目。它是基於收入的應用程序,它在應用程序的每個控制器和操作中都有一些過濾器。它們是一些過濾器的年份和季度。對於這些過濾器更改,我使用了創建基本模型(它包含這些過濾器值),並且每個其他模型都從此基本模型繼承。基礎模型在@layout視圖中使用。 每次更改過濾器都應更新視圖。在佈局視圖像這樣
處理ASP.NET MVC應用程序的參數

public class BaseModel 
{ 
public string YearSelected{ get; set;} 
public string QuarterSelected{ get; set;} 
} 

等車型 基本型號從這個BaseModel

public class RevenueModel:BaseModel 
{ 
// other stuff 
} 


繼承這些東西,我通過parameters.Seems如發送現在參數是增加需求是增加更多參數的變化
1.我想知道處理的方法是否正確,如果方法是欠缺的icient建議我最好用 的方式來處理這個參數的變化。

2.In的UI(視圖),
當用戶更改通過檢查單選按鈕的視圖,並點擊應用,我使用jquery爲處理這個過濾器按鈕,

window.href='Url Action with new Parameters'; 
window.href='@Url.Action("SomeAction","Controller",new{ // those all parameters } '; 

當按鈕點擊窗口。 href會自動調用並更新我想知道的視圖
這種方法是否健壯?建議我最好的方式來處理這種情況。

「只要我需要,如果我使用jQuery來調用一個動作,並使用高數量的參數調用控制器動作的答案」

+0

我並不十分清楚#1。你問是否可以在需要傳遞更多參數時向模型添加更多屬性? –

+0

@JoshNoe是的,現在它有大約10個參數 – unique

+0

Howmany params是我們在這裏談論的嗎?如果我理解你的問題,那麼你應該在單選按鈕上進行POST選擇並刷新頁面。在帖子中,您可以將模型作爲單個參數傳遞,您不必擔心這裏有多個參數。 – HaBo

回答

3

你在做什麼是可行的,但作爲@ ps2goat指出,如果URL中的GET參數太多,可能會遇到問題。

但正確的答案取決於如何使用過濾器。用戶是否經常更換過濾器,還是很少更換過濾器?如果用戶希望通過您的應用程序瀏覽和很少更換過濾器,我建議你使用另一種方法不是包括在URL中的參數,GET參數,因爲:

  1. 您可能會遇到的問題,如果@ ps2goat指出,您的網址總長度變得太長。
  2. 您可能會遇到用戶體驗問題。如果用戶爲一個頁面書籤,然後更改他的過濾器,並使用書籤返回到較早的頁面,他的過濾器將被恢復,這可能不是他所期望的。
  3. 它看起來不會很漂亮。您網站上的所有網址看起來像/controller/action/?YearSelected=2014&QuarterSelected=1&Parameter3=2&Parameter4=8,這也可能會造成您需要處理的搜索引擎優化問題。

在這種情況下,我建議您考慮使用Cookie或在服務器上保存用戶的過濾器。 (但最好不要在Session中,因爲這可能會爲您的應用程序創建可伸縮性問題)。如果您使用的是Cookie,那麼用戶的過濾器將自動適用於您的Controller Action,因爲Cookie將隨每個請求一起發送。 (當考慮使用哪種策略時,這當然也是需要考慮的事情。如果您有很多cookie數據,這會降低您的應用程序的感知響應速度,因爲Cookie數據必須隨每個請求一起發送到您的服務器。因此,保持您的Cookie數據儘可能小)

另一方面,如果您希望用戶經常更改過濾器,甚至可能在同一頁上多次更改過濾器,則可以考慮使用jQuery執行異步POST你的MVC控制器,使用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視圖模型來封裝它。但是這應該讓你開始。

+0

謝謝你的回覆,第一件事經常(經常)用戶更改過濾器。這些參數包括年份,季度,過濾器等視圖,以便用戶更改這些值,並且他需要儘快查看視圖上的更新。他瀏覽不同的視圖,但也需要其他視圖的這些參數。到目前爲止,我管理了大約12個參數。現在還沒有問題,以及這是僅限於組織內的Intranet應用程序。視圖是包含大約25行的季度值的大表。這是Intranet應用程序不需要維護SEO的東西。 – unique

+0

好的,在這種情況下,我建議您考慮一種組合方法,即將篩選器存儲在cookie中,並在篩選器更改後立即更新視圖。然後,您不會遇到冗長網址或用戶遇到書籤問題時的任何問題,並且該視圖在更改過濾器時會立即刷新。他們的過濾器也將在訪問之間被記住,這是用戶體驗獎金。 –

相關問題