【问题标题】:Dates in Querystring using url.action going awry使用 url.action 出错的 Querystring 中的日期
【发布时间】:2015-05-29 09:11:09
【问题描述】:

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

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

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),过滤器可以正常工作并且他们会离开。 但是,当他们单击返回列表中的某个项目时,我将过滤保留在查询字符串中,以便他们可以导航并返回过滤器仍然在位。 这再次工作正常,直到他们当然按日期过滤,当它陷入混乱并堆积成一堆。 为了生成导航链接,我编写了一个类似这样的助手:

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 格式。 我还尝试使用长刻度属性包装日期时间过滤器属性,但也失败了..

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

谢谢

自然

【问题讨论】:

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


    【解决方案1】:

    看看这个帖子,它会对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"}) %>
    

    【讨论】:

    • 嗨,感谢您的回复。问题是我使用模型来保存数据,所以我根本没有机会单独处理日期,或者我可以按照我当时希望的方式格式化它们..
    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2023-03-16
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多