[英]Calling a controller function from onchange event in html view
我是一名新的C#開發人員,我有一個下拉列表,其中填充了以下格式的字符串日期:“ Jul 2017”。 列表中最多可以包含12個條目。
當用戶選擇一個日期時,我想將該選擇傳遞給控制器方法,將其轉換為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);
}
向控制器獲取值的通常方法是讓用戶將頁面發布回服務器,例如,通過提交按鈕。 發生這種情況時,控制器的操作方法可以將所選項目作為參數接收,然后執行其需要執行的操作。 因此,如果您只希望用戶提交表單,並允許網站根據所選值(以及根據該值計算的列表)呈現下一頁,則只需要做。
另一方面,也許您不希望用戶提交頁面。 您希望在頁面中顯示一系列日期,或者希望通過瀏覽器中運行的代碼處理日期。 如果是這種情況,我建議您在瀏覽器本身中使用Javascript執行計算,從而避免往返。 GetDates()
方法中的任何內容都不需要任何服務器端數據,因此這只是將c#代碼轉換為Javascript代碼的問題。
在極少數情況下,您希望頁面上的UX元素根據服務器計算立即得到更新,而無需發布頁面。 如果您要這樣做,則必須使用其他海報提供的AJAX解決方案。 它要復雜得多,工作也要多得多。 如果不需要,請使用我上面提供的解決方案之一。
您可以對HTML Select選項(DropDownList)使用OnChange EventHandler來啟動對控制器的Ajax調用,只需創建一個JavaScript函數即可對包含用戶所選數據的Jquery Ajax請求執行到控制器的操作,並使用Return Json()
而不是Return View()
,然后使用JavaScript處理檢索到的數據,您的控制器將需要接受一個參數,以便從Ajax請求中接收數據
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設置中使用fail attr處理請求錯誤,但我會留給您
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.