2017-07-07 73 views
0

我是一名新的c#開發人員,我有一個填充字符串日期的下拉列表,格式如下:「2017年7月」。列表中最多可以有12個條目。在html視圖中調用onchange事件的控制器函數

當用戶選擇日期時,我想將該選擇傳遞給控制器​​方法,將其轉換爲DateTime格式,然後使用該日期進行進一步處理。

如何將用戶選擇傳遞給控制器​​以便它可以被轉換和使用?我已經在下面列出了註釋掉的代碼,以顯示我想如何執行轉換。把日期交給控制器是我的挑戰。

我已經看過類似的問題在這個網站上,他們都似乎過於複雜(也許是由於我的天真),但我希望有一個更簡化的解決方案。

HTML視圖代碼

@Html.DropDownList("selectList", Model.ReverseMonthsLists()) 

查看型號代碼

public IEnumerable<SelectListItem> ReverseMonthsLists() 
    { 
     var selectListItems = GetDates() 
      .Select(_ => _.ToString("MMM yyyy")) 
      .Select((dateString, index) => new SelectListItem 
       { Selected = index == 0, Text = dateString, Value = dateString }) 
      .ToList(); 
     return selectListItems; 
    } 

public static IEnumerable<DateTime> GetDates() 
{ 
    DateTime startDate = new DateTime(2017, 6, 1).Date; 
    var currentDate = DateTime.Now.Date; 
    int numberOfMonthsToShow = (currentDate.Year - startDate.Year) * 12 + 
     currentDate.Month - startDate.Month; 
    var dates = new List<DateTime>(numberOfMonthsToShow); 
    currentDate = currentDate.AddMonths(-1); 

    for (int i = 0; i < numberOfMonthsToShow; i++) 
    { 
     dates.Add(currentDate); 
     currentDate = currentDate.AddMonths(-1); 
    } 

    return dates; 
} 

控制器功能

public ActionResult Report_Performance() 
    { 
     //var newDate = DateTime.Parse(strDate); //<- Use newDate as parameter value into aVar to replace date at the end of the string 
     var aVar = Models.Reporting.ListingStatsReportingViewModel.GetStats(userCurrentService.CompanyId.Value, Models.Reporting.DateTimePeriod.Monthly, DateTime.Now.Date.AddMonths(-1)); 
     return this.View(aVar); 
    } 

回答

1

正常的方式來獲得對控制器的價值是讓用戶將頁面發回服務器,例如通過提交按鈕。發生這種情況時,控制器的操作方法可以接收所選項目作爲參數,然後執行所需操作。因此,如果您只是希望用戶提交表單並允許網站根據所選值(以及基於該值計算的列表)來呈現下一頁,那就是您所需要做的。

另一方面,也許你不希望用戶提交頁面;您希望在頁面中顯示一系列日期,或者讓瀏覽器中運行的代碼處理日期。如果是這樣的話,我會建議你在瀏覽器本身的Javascript中執行計算,從而避免了往返的需要。您的GetDates()方法中沒有任何內容需要任何服務器端數據,所以這只是將您的C#代碼轉換爲Javascript代碼的問題。

在一些極少數情況下,您希望頁面上的UX元素根據服務器計算立即更新,而不會發布頁面。如果這是你想要的,你將不得不使用其他海報提供的AJAX解決方案。這是更復雜和更多的工作。如果您不需要,請使用上面提供的解決方案之一。

+0

John Wu,我遵循了你的建議,並使用了回帖後的方法。但我的選擇並未反映在屏幕上。刷新後,列表將恢復爲默認選擇。我該如何解決? – csharpMind

+0

您將需要修改呈現列表的視圖,以確保它預先選擇提交的任何值。 –

+0

我明白你在說什麼。但我不知道如何讓它發生。你能提供更具體的指導嗎? – csharpMind

0

您可以使用Ø n轉換HTML選擇選項的EventHandler (DropDownList)要向控制器啓動Ajax調用,只需創建一個JavaScript函數,該函數執行一個JQuery包含用戶選定數據的Ajax請求到控制器並從控制器檢索JSON使用Return Json()而不是Return View(),然後處理檢索的數據使用JavaScript,您的控制器將需要接受一個參數,以便接收將數據從Ajax請求

+0

Mostafa ELite,聽起來不錯。但作爲一個新手,我不太瞭解語法。您能否指出我OnChange EventHandler的語法的簡明參考資料,以及有關如何「將包含用戶選定數據的Jquery Ajax請求預製到控制器」的參考資料?我會很樂意做這個閱讀。但是我一直在互聯網和這個網站上奔波幾個小時,並得到大量令人困惑的信息。 – csharpMind

0
function SendDataToController (TheDropDownName){ 
     var DataToSend = $('#'+TheDropDownName).text(); 
     // Or Pass `this` From The Html When Assigning The Event Listener 
     // and Do Something Like var DataToSend = this.text(); 
     $.ajax({ 
      url: "@(Url.Action("ActionName", "ControllerName"))", 
      data: DataToSend, 
      success: function(ResponseFromController){ 
      //Do Stuff With Response 
      } 
    }); 
} 

這將數據發送到控制器所以,你應該接受它在參數

public ActionResult MyAction (string DataToSend) 
{ 
    //Do Stuff With Data and Get a Json Object To Return 
    Return Json(JsonObject); 
} 

MVC Ajax是必不可少的所以你應該學習它之前嘗試工作任何MVC項目,你也應該處理請求錯誤在Ajax設置中使用失敗attr但我會留給你

相關問題