使用url查询字符串中的日期.行动出错

本文关键字:日期 出错 url 查询 字符串 使用 | 更新日期: 2023-09-27 17:51:02

我知道在查询字符串中处理日期的方式使用不变区域性。然而,我似乎找不到一个适合我需要的解决方案。

我有一个项目列表,我使用张贴表单进行过滤,过滤器被包装在一个类中,包括各种其他选项以及开始/结束日期,因此:

public class FilterOptions{
  public int? BrandID{get;set;}
  public string SearchTerm{get;set;}
  public DateTime? FromDate{get;set;}
  public DateTime? ToDate{get;set;}
  //etc....
}

所以用户选择了他们的过滤器并点击应用,当表单发布时(因此坚持我的文化设置dd/MM/yyyy)过滤器工作良好,它们就离开了。但是,当他们单击返回列表中的一个项目时,我将在querystring中持久化过滤,以便他们可以导航并返回过滤器。这工作得很好,当然,直到他们按日期过滤,当它陷入混乱,倒在一堆。为了生成用于导航的链接,我编写了一个类似于以下内容的帮助器:

public static HtmlString NavigationActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, FilterOptions filter)
{
    if (string.IsNullOrEmpty(controllerName))
    {
        controllerName = (string)htmlHelper.ViewContext.RouteData.GetRequiredString("controller");
    }
    RouteValueDictionary filterRVD = new RouteValueDictionary(filter);
    RouteValueDictionary rvd = new RouteValueDictionary(routeValues);
    RouteValueDictionary routeCombined = new RouteValueDictionary(filterRVD.Union(rvd).ToDictionary(k => k.Key, k => k.Value));
    var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
    var anchor = new TagBuilder("a");
    anchor.InnerHtml = linkText;
    anchor.Attributes["href"] = urlHelper.Action(actionName, controllerName, routeCombined);
    return MvcHtmlString.Create(anchor.ToString());
}

是urlHelper。操作,当在routeValueDictionary中添加时,该操作将日期的月份放在第一位。我确实有一个自定义模型绑定器,它使用我的GB文化-从web中的文化设置中提取。config -正确解析任何日期,并使用同样使用GB格式的日期拾取器我对此做了相当多的搜索,人们建议使用刻度,或者将日期设置为iso yyyy-mm-dd格式。

我的问题是,我该如何实现这个?我试着改变所有的日期格式,使用yyyymmdd格式,但url。Action仍然决定使用mmdyyyy格式。我还尝试用长刻度属性包装日期时间过滤器属性,但也失败了。

如果有人能提供一些帮助,将不胜感激

感谢

nat

使用url查询字符串中的日期.行动出错

看看这个线程,它会帮助你的

试着把你的日期按如下格式放到查询字符串中:

item.performanceDate.ToString("dd-MMM-yyyy")

这将给你一个URL(如果你没有使用路由):

http://foo/Performance/Details?name=someName&venue=someVenue&date=31-Mar-2011

这很有用,因为您需要避免在查询字符串上的日期中使用斜杠,并且您需要明确月份/日期的位置(整个美国和英国)。建议使用数字表示日期,使用大写字母表示月份。

在你的ActionMethod中,你可以简单地将传入的值TryParse() or Parse()

var dt = DateTime.Parse(date);

在LINQ查询中,你可以这样做:

&& s.performanceDate == dt 

所以把它们放在一起:

public ActionResult Details(String name, String venue, String date)
{
    DateTime dt;
    if (DateTime.TryParse(date, out dt))
    {
        return View(_repository.performanceDetails(name, venue, dt));    
    }
    else
    {
        return View("Error", "The value passed in date isn't a date value.");
    }
}
public PerformanceDetails performanceDetails(String name, String venue, DateTime dt)
{
    var PerformanceDetails = (from s in _db.PerformanceDetails
                              where s.show == name && 
                                    s.venue == venue && 
                                   s.performanceDate == dt.Date                  
                              select s).First();
    return PerformanceDetails;
}
<%= Html.ActionLink("View Details", "Details", "Performances", 
                new { name = item.show , 
                      venue = item.venue, 
                      date = item.performanceDate.ToString("dd-MMM-yyyy") }, 
                new {@class = "button"}) %>