使用url.action的Querystring中的日期出错

时间:2015-05-29 09:11:09

标签: c# asp.net-mvc datetime query-string cultureinfo

我知道在查询字符串中处理日期的方式使用不变文化。但是,我似乎无法找到解决这个问题的解决方案来满足我的需求。

我有一个项目列表,我使用已发布的表单进行过滤,过滤器包含在一个类中,包括各种其他选项以及开始/结束日期:

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)时,过滤器工作正常并且远离它们。 但是,当他们点击返回列表中的项目时,我会在查询字符串中保持过滤,以便他们可以导航并返回其过滤器仍然存在。 再次,这工作正常,直到当然他们过滤了一个日期,当它进入一个kerfuffle并摔倒在一堆。 为了生成导航链接,我写了一个帮助器,如下所示:

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.Action,在routeValueDictionary中添加时,首先将日期格式化为月份。 我有一个自定义模型绑定器,它使用我的GB文化 - 从web.config中的文化设置中提取 - 正确解析任何日期,并使用也使用GB格式的日期选择器 我已经对此进行了相当多的搜索,人们建议使用刻度线,或者将日期设置为iso yyyy-mm-dd格式。

我的问题是,我该如何实现?我尝试更改所有日期格式以使用yyyymmdd格式,但url.action仍然决定它想要mmddyyyy格式。 我还尝试使用长ticks属性包装日期时间过滤器属性,但也失败了..

如果有人可以提供一些帮助,我们将不胜感激

感谢

NAT

1 个答案:

答案 0 :(得分:0)

看看这个帖子,它对you

有帮助

尝试使用以下格式将日期放在查询字符串上:

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"}) %>