簡體   English   中英

從HTML視圖中的onchange事件調用控制器函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM