2017-07-07 70 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但我会留给你

相关问题