天道酬勤,学无止境

具有错误日期格式的MVC DateTime绑定(MVC DateTime binding with incorrect date format)

问题

Asp.net-MVC现在允许DateTime对象的隐式绑定。 我采取了以下行动

public ActionResult DoSomething(DateTime startDate) 
{ 
... 
}

这成功地将一个字符串从ajax调用转换为DateTime。 但是,我们使用日期格式dd / MM / yyyy; MVC正在转换为MM / dd / yyyy。 例如,使用字符串'09 / 02/2009'提交对操作的调用会导致DateTime为'02 / 09/2009 00:00:00',或者在我们的本地设置中为9月2日。

我不想为了日期格式而滚动自己的模型活页夹。 但是似乎不需要更改操作以接受字符串,然后如果MVC能够为我执行此操作,则可以使用DateTime.Parse。

有什么方法可以更改DateTime的默认模型联编程序中使用的日期格式? 默认模型联编程序是否不应该使用您的本地化设置?

回答1

我刚刚通过更详尽的谷歌搜索找到了答案:

梅尔文·哈伯(Melvyn Harbor)全面解释了为什么MVC会以这种方式使用日期,以及在必要时如何覆盖日期:

http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx

在寻找要解析的值时,框架按特定顺序查找,即:

  1. RouteData(上面未显示)
  2. URI查询字符串
  3. 申请表

然而,只有这些中的最后一个会了解文化。 从本地化的角度来看,这有一个很好的理由。 想象一下,我已经编写了一个Web应用程序,该应用程序显示了我在线发布的航班信息。 我通过单击当天的链接(可能是http://www.melsflighttimes.com/Flights/2008-11-21之类的链接)来查询某个日期的航班,然后通过电子邮件将该链接发送给我的同事美国。 我们可以保证我们都将查看同一页数据的唯一方法是是否使用InvariantCulture。 相比之下,如果我使用表格来预订我的航班,那么一切都会在一个紧要的周期中发生。 数据在写入表单时可以遵循CurrentCulture,因此从表单返回时需要遵循数据。

回答2

我会在全球范围内设定您的文化。 ModelBinder接起来!

  <system.web>
    <globalization uiCulture="en-AU" culture="en-AU" />

或者,您只需为此页面进行更改。
但是在全球范围内,我认为更好

回答3

我在将短日期格式绑定到DateTime模型属性时遇到了同样的问题。 在查看了许多不同的示例(不仅涉及DateTime)之后,我将以下内容放在一起:

using System;
using System.Globalization;
using System.Web.Mvc;

namespace YourNamespaceHere
{
    public class CustomDateBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            if (controllerContext == null)
                throw new ArgumentNullException("controllerContext", "controllerContext is null.");
            if (bindingContext == null)
                throw new ArgumentNullException("bindingContext", "bindingContext is null.");

            var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            if (value == null)
                throw new ArgumentNullException(bindingContext.ModelName);

            CultureInfo cultureInf = (CultureInfo)CultureInfo.CurrentCulture.Clone();
            cultureInf.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);

            try
            {
                var date = value.ConvertTo(typeof(DateTime), cultureInf);

                return date;
            }
            catch (Exception ex)
            {
                bindingContext.ModelState.AddModelError(bindingContext.ModelName, ex);
                return null;
            }
        }
    }

    public class NullableCustomDateBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            if (controllerContext == null)
                throw new ArgumentNullException("controllerContext", "controllerContext is null.");
            if (bindingContext == null)
                throw new ArgumentNullException("bindingContext", "bindingContext is null.");

            var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            if (value == null) return null;

            CultureInfo cultureInf = (CultureInfo)CultureInfo.CurrentCulture.Clone();
            cultureInf.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);

            try
            {
                var date = value.ConvertTo(typeof(DateTime), cultureInf);

                return date;
            }
            catch (Exception ex)
            {
                bindingContext.ModelState.AddModelError(bindingContext.ModelName, ex);
                return null;
            }
        }
    }
}

为了与在Global ASAX文件中重新注册路由等方式保持一致,我还向名为CustomModelBinderConfig的MVC4项目的App_Start文件夹中添加了一个新的语法类:

using System;
using System.Web.Mvc;

namespace YourNamespaceHere
{
    public static class CustomModelBindersConfig
    {
        public static void RegisterCustomModelBinders()
        {
            ModelBinders.Binders.Add(typeof(DateTime), new CustomModelBinders.CustomDateBinder());
            ModelBinders.Binders.Add(typeof(DateTime?), new CustomModelBinders.NullableCustomDateBinder());
        }
    }
}

然后,我仅从全局ASASX Application_Start调用静态RegisterCustomModelBinders,如下所示:

protected void Application_Start()
{
    /* bla blah bla the usual stuff and then */

    CustomModelBindersConfig.RegisterCustomModelBinders();
}

这里需要注意的重要一点是,如果您将DateTime值写入这样的hiddenfield:

@Html.HiddenFor(model => model.SomeDate) // a DateTime property
@Html.Hiddenfor(model => model) // a model that is of type DateTime

我这样做了,页面上的实际值的格式为“ MM / dd / yyyy hh:mm:ss tt”,而不是我想要的“ dd / MM / yyyy hh:mm:ss tt”。 这导致我的模型验证失败或返回错误的日期(显然交换了日期和月份值)。

经过大量的尝试和失败的尝试之后,解决方案是通过在Global.ASAX中执行以下操作来设置每个请求的区域性信息:

protected void Application_BeginRequest()
{
    CultureInfo cInf = new CultureInfo("en-ZA", false);  
    // NOTE: change the culture name en-ZA to whatever culture suits your needs

    cInf.DateTimeFormat.DateSeparator = "/";
    cInf.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
    cInf.DateTimeFormat.LongDatePattern = "dd/MM/yyyy hh:mm:ss tt";

    System.Threading.Thread.CurrentThread.CurrentCulture = cInf;
    System.Threading.Thread.CurrentThread.CurrentUICulture = cInf;
}

如果将其粘贴在Application_Start甚至Session_Start中,它将无法工作,因为这会将其分配给会话的当前线程。 众所周知,Web应用程序是无状态的,因此以前为您的请求提供服务的线程与为您当前的请求提供服务的线程是同一线程,因此您的区域性信息已进入了数字化天空中的重要GC。

感谢:Ivan Zlatev-http://ivanz.com/2010/11/03/custom-model-binding-using-imodelbinder-in-asp-net-mvc-two-gotchas/

garik-https://stackoverflow.com/a/2468447/578208

德米特里-https://stackoverflow.com/a/11903896/578208

回答4

在MVC 3中,它会稍有不同。

假设我们有一个控制器和一个带有Get方法的视图

public ActionResult DoSomething(DateTime dateTime)
{
    return View();
}

我们应该添加ModelBinder

public class DateTimeBinder : IModelBinder
{
    #region IModelBinder Members
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        DateTime dateTime;
        if (DateTime.TryParse(controllerContext.HttpContext.Request.QueryString["dateTime"], CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out dateTime))
            return dateTime;
        //else
        return new DateTime();//or another appropriate default ;
    }
    #endregion
}

以及Global.asax的Application_Start()中的命令

ModelBinders.Binders.Add(typeof(DateTime), new DateTimeBinder());
回答5

还值得注意的是,即使不创建自己的模型绑定程序,也可能会解析多种不同的格式。

例如,在美国,以下所有字符串都是等效的,并自动绑定到相同的DateTime值:

/ company / press / may%2001%202008

/ company / press / 2008-05-01

/ company / press / 05-01-2008

我强烈建议您使用yyyy-mm-dd,因为它更便于携带。 您真的不想处理多种本地化格式。 如果有人在5月1日而不是1月5日预订航班,那么您将遇到大麻烦!

注意:如果在所有文化中都对yyyy-mm-dd进行了通用解析,我还不清楚,因此也许知道的人可以添加评论。

回答6

尝试使用toISOString()。 它以ISO8601格式返回字符串。

GET方法

javascript

$.get('/example/doGet?date=' + new Date().toISOString(), function (result) {
    console.log(result);
});

C#

[HttpGet]
public JsonResult DoGet(DateTime date)
{
    return Json(date.ToString(), JsonRequestBehavior.AllowGet);
}

POST方法

javascript

$.post('/example/do', { date: date.toISOString() }, function (result) {
    console.log(result);
});

C#

[HttpPost]
public JsonResult Do(DateTime date)
{
     return Json(date.ToString());
}
回答7

我在MVC4上设置了以下配置,它的工作原理很像

<globalization uiCulture="auto" culture="auto" />
回答8
  public class DateTimeFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.RequestType == "GET")
        {

            foreach (var parameter in filterContext.ActionParameters)
            {
                var properties = parameter.Value.GetType().GetProperties();

                foreach (var property in properties)
                {
                    Type type = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;

                    if (property.PropertyType == typeof(System.DateTime) || property.PropertyType == typeof(DateTime?))
                    {
                        DateTime dateTime;

                        if (DateTime.TryParse(filterContext.HttpContext.Request.QueryString[property.Name], CultureInfo.CurrentUICulture, DateTimeStyles.None, out dateTime))
                            property.SetValue(parameter.Value, dateTime,null);
                    }
                }

            }
        }
    }
}
回答9
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    var str = controllerContext.HttpContext.Request.QueryString[bindingContext.ModelName];
    if (string.IsNullOrEmpty(str)) return null;
    var date = DateTime.ParseExact(str, "dd.MM.yyyy", null);
    return date;
}
回答10

我将CurrentCultureCurrentUICulture设置为我的自定义基本控制器

    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);

        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-GB");
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-GB");
    }

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Asp.net MVC中的自定义DateTime模型绑定程序(Custom DateTime model binder in Asp.net MVC)
    问题 我想为DateTime类型编写我自己的模型活页夹。 首先,我想编写一个可以附加到模型属性的新属性,例如: [DateTimeFormat("d.M.yyyy")] public DateTime Birth { get; set,} 这是简单的部分。 但是活页夹部分要困难一些。 我想为DateTime类型添加一个新的模型活页夹。 我可以 实现IModelBinder接口并编写我自己的BindModel()方法从DefaultModelBinder继承并重写BindModel()方法 我的模型具有上述属性( Birth )。 因此,当模型尝试将请求数据绑定到此属性时,将调用我的模型绑定器的BindModel(controllerContext, bindingContext) 。 一切正常,但是。 如何从controller / bindingContext获取属性属性,以正确解析我的日期? 如何到达属性Birth的PropertyDesciptor ? 编辑 由于关注点分离,我的模型类是在不(也不应该)引用System.Web.MVC程序集的程序集中定义的。 设置自定义绑定(类似于Scott Hanselman的示例)属性在这里是不行的。 回答1 我认为您不应该在模型上放置特定于语言环境的属性。 此问题的两个其他可能的解决方案是:
  • MVC4 DataType.Date EditorFor将不会在Chrome中显示日期值,但在Internet Explorer中很好(MVC4 DataType.Date EditorFor won't display date value in Chrome, fine in Internet Explorer)
    问题 我在模型上使用DataType.Date属性,并在视图中使用EditorFor。 在Internet Explorer 8和Internet Explorer 9中,这可以正常工作,但是在Google Chrome中,它显示的是日期选择器,而不是显示值,而只是以淡灰色文本显示“月/日/年”。 Google Chrome为什么不显示该值? 模型: [DataType(DataType.Date)] public Nullable<System.DateTime> EstPurchaseDate { get; set; } 看法: <td class="fieldLabel">Est. Pur. Date</td> <td class="field">@Html.EditorFor(m=>m.EstPurchaseDate)</td> 回答1 当使用[DataType(DataType.Date)]装饰模型属性时,ASP.NET MVC 4中的默认模板将生成type="date"的输入字段: <input class="text-box single-line" data-val="true" data-val-date="The field EstPurchaseDate must be a date." id="EstPurchaseDate" name=
  • ASP.NET MVC JsonResult日期格式(ASP.NET MVC JsonResult Date Format)
    问题 我有一个控制器操作,可以有效地简单返回模型的JsonResult。 因此,在我的方法中,我有以下内容: return new JsonResult(myModel); 除一个问题外,此方法运行良好。 模型中有一个date属性,它似乎在Json结果中返回,如下所示: "\/Date(1239018869048)\/" 我应该如何处理日期,以便它们以我需要的格式返回? 或者如何在脚本中处理上面的这种格式? 回答1 只是为了扩展casperOne的答案。 JSON规范不考虑Date值。 MS必须打个电话,他们选择的路径是利用字符串的javascript表示形式中的一个小技巧:字符串文字“ /”与“ \ /”相同,并且字符串文字永远不会序列化为“ \ /”(即使“ \ /”也必须映射到“ \\ /”)。 有关更好的说明,请参见http://msdn.microsoft.com/zh-cn/library/bb299886.aspx#intro_to_json_topic2(向下滚动到“从JavaScript文字到JSON”) JSON的痛处之一是缺少日期/时间文字。 许多人在初次遇到JSON时会感到惊讶和失望。 对于缺少日期/时间文字的简单解释(是否可以安慰)是JavaScript从来没有过:在JavaScript中对日期和时间值的支持完全通过Date对象提供。 因此
  • jQuery UI Datepicker和MVC视图模型类型datetime(jquery ui datepicker and mvc view model type datetime)
    问题 我在视图模型上使用jQuery Datepicker 这是我的看法: @Html.TextBoxFor(o => o.JobStartDate, new { id = "dt1", @class = "input-block-level" }) @Html.ValidationMessage("JobStartDate") 和我的脚本: $("#dt1").datepicker({ dateFormat: "dd/mm/yy" }); 如果我的日期小于等于12,一切正常,如果我的日期大于12,它将显示一条验证错误消息,提示“字段开始日期必须是日期。” (我正在使用jquery验证) 例如:日期2014年12月12日会给我错误,而2014年12月12日则不会 这是我的视图模型: [Required] [DataType(DataType.Date)] [Display(Name = "Start Date")] public DateTime JobStartDate { get; set; } 我怀疑我的视图模型正在预期格式为mm / dd / yyyy的日期,而在我的日期选择器中我指定了dd / mm / yy,有没有办法告诉我的视图模型我期望dd / mm / yy格式,所以如果日期> = 12,则不会引发错误消息。 回答1
  • 仅来自TextBoxFor()的日期(Date only from TextBoxFor())
    问题 我无法使用TextBoxFor <,>(表达式,htmlAttributes)将DateTime的唯一日期部分显示到文本框中。 该模型基于Linq2SQL,字段是SQL上的Entity模型中的DateTime。 失败的: <%= Html.TextBoxFor(model => model.dtArrivalDate, String.Format("{0:dd/MM/yyyy}", Model.dtArrivalDate))%> 该技巧似乎已被弃用,对象htmlAttribute中的任何字符串值都将被忽略。 失败的: [DisplayFormat( DataFormatString = "{0:dd/MM/yyyy}" )] public string dtArrivalDate { get; set; } 我想只在细节/编辑视图中存储和显示日期部分,而没有“ 00:00:00”部分。 回答1 [DisplayName("Start Date")] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] public DateTime StartDate { get; set; } 然后: <%=Html.EditorFor(m => m.StartDate) %>
  • 如何在对Spring MVC Controller的GET请求中接受Date参数?(How to accept Date params in a GET request to Spring MVC Controller?)
    问题 我有一个GET请求,该请求以YYYY-MM-DD格式发送日期到Spring Controller。 控制器代码如下: @RequestMapping(value="/fetch" , method=RequestMethod.GET) public @ResponseBody String fetchResult(@RequestParam("from") Date fromDate) { //Content goes here } 我正在使用Firebug进行检查时,请求已正确发送。 我得到了错误: HTTP状态400:客户端发送的请求在语法上不正确。 如何使控制器接受这种日期格式? 请帮忙。 我究竟做错了什么? 回答1 好的,我解决了。 写给那些在一整天不间断的编码后可能会累并且错过这种愚蠢的事情的人。 @RequestMapping(value="/fetch" , method=RequestMethod.GET) public @ResponseBody String fetchResult(@RequestParam("from") @DateTimeFormat(pattern="yyyy-MM-dd") Date fromDate) { //Content goes here } 是的,很简单。 只需添加DateTimeFormat批注。 回答2
  • Entity Framework: “Store update, insert, or delete statement affected an unexpected number of rows (0).” [closed](Entity Framework: “Store update, insert, or delete statement affected an unexpected number of rows (0).” [closed])
    问题 关闭。 这个问题需要调试细节。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 2年前关闭。 改善这个问题 我正在使用实体框架填充网格控件。 有时,当我进行更新时,会出现以下错误: 存储更新,插入或删除语句影响了意外的行数(0)。 自加载实体以来,实体可能已被修改或删除。 刷新ObjectStateManager条目。 我不知道如何重现这一点。 但这可能与我进行更新的紧密程度有关。 是否有人看到过此消息,或者是否有人知道错误消息指的是什么? 编辑:不幸的是,我不再自由重现我在这里遇到的问题,因为我退出了这个项目,不记得我是否最终找到了解决方案,是否有其他开发人员修复了该解决方案,或者我是否在解决该问题。 因此,我不能接受任何答案。 回答1 这就是所谓的乐观并发功能的副作用。 不能100%确定如何在Entity Framework中打开/关闭它,但是基本上它告诉您的是,当您从数据库中获取数据到保存所做的更改之间,其他人已经更改了数据(这意味着您进入数据库后,将其保存为0行实际上已更新)。 用SQL术语来说,他们的update查询的where子句包含该行中每个字段的原始值,如果0行受到影响,它知道出了问题。 其背后的想法是,您最终不会覆盖应用程序不知道发生的更改-基本上是.NET在所有更新上抛出的一点安全措施。 如果一致
  • 将datetime2数据类型转换为datetime数据类型会导致超出范围的值(Conversion of a datetime2 data type to a datetime data type results out-of-range value)
    问题 我有一个包含5列的数据表,其中一行被数据填充,然后通过事务保存到数据库中。 保存时,将返回错误: 将datetime2数据类型转换为datetime数据类型导致超出范围的值 这意味着,读,我的表具有类型DateTime2和我的数据库中的DateTime ; 那是错的。 日期列设置为DateTime如下所示: new DataColumn("myDate", Type.GetType("System.DateTime")) 问题 可以在代码中解决此问题,还是必须在数据库级别上进行某些更改? 回答1 您在该栏中有什么样的日期? 它们是否都适合该类型的范围? 顺便说一句,为DataColumn构造函数获取Type对象的正确方法是typeof关键字,它的速度要快typeof数量级。 因此,要创建列,您应该编写 new DataColumn("myDate", typeof(DateTime)) 回答2 如果在字段不接受NULL值时未为DateTime字段分配值,则会发生这种情况。 这为我解决了! 回答3 DATETIME和DATETIME2映射到.NET中的System.DateTime您实际上不能执行“转换”,因为它实际上是相同的.NET类型。 请参阅MSDN文档页面:http://msdn.microsoft.com/zh-cn/library/bb675168.aspx
  • MVC DateTime binding with incorrect date format
    Asp.net-MVC now allows for implicit binding of DateTime objects. I have an action along the lines of public ActionResult DoSomething(DateTime startDate) { ... } This successfully converts a string from an ajax call into a DateTime. However, we use the date format dd/MM/yyyy; MVC is converting to MM/dd/yyyy. For example, submitting a call to the action with a string '09/02/2009' results in a DateTime of '02/09/2009 00:00:00', or September 2nd in our local settings. I don't want to roll my own model binder for the sake of a date format. But it seems needless to have to change the action to
  • 使用Json.Net以dd / mm / yyyy格式反序列化日期(Deserializing dates with dd/MM/yyyy format using Json.Net)
    问题 我试图将对象从JSON数据反序列化为C#类(我使用的是Newtonsoft Json.NET)。 数据包含日期,例如字符串值,如09/12/2013 ,格式为dd/MM/yyyy 。 如果我调用JsonConvert.DeserializeObject<MyObject>(data) ,则将DateTime以MM/dd/yyyy格式加载到C#类的DateTime属性中,这将导致日期值为12 September 2013 9 December 2013 12 September 2013 (而不是12 September 2013 9 December 2013 ) 。 是否可以将JsonConvert配置JsonConvert以正确的格式获取日期? 回答1 您可以使用IsoDateTimeConverter并指定DateTimeFormat以获取所需的结果,例如: MyObject obj = JsonConvert.DeserializeObject<MyObject>(jsonString, new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" }); 演示: class Program { static void Main(string[] args) { string json = @"{ ""Date""
  • 如何格式化DataGridView中的DateTime列?(How to format DateTime columns in DataGridView?)
    问题 我正在使用带有对象数据绑定的DataGridView来显示有关系统中日志记录实体的信息,这些信息是通过SOAP从远程服务中检索到的。 其中一列称为“最后操作”,是指实体最后一次记录消息的时间。 它是一个System.DateTime值。 当我阅读SOAP响应(下面的示例)时,他的时间戳显然包含了所有信息,直到第二部分为止。 <LoggingEntity> <host>marty86ce</host> <process>10148</process> <logger>http_core</logger> <appName>httpd</appName> <ffda>true</ffda> <lastAction>2010-10-27T12:00:19.5117509Z</lastAction> <lastHeartbeat>0001-01-01T00:00:00</lastHeartbeat> <channelId>em_9BA2A2B4D0B6E66</channelId> <ffdaChannelId>em_E7C8D1D4DE8EEB9</ffdaChannelId> </LoggingEntity> 当我将其显示在桌子上时,我最多可以阅读几分钟 当我按下刷新按钮时,我使用以下代码进行数据绑定 public void RefreshEntities() {
  • 如何解析JSON以在JavaScript中接收Date对象?(How to parse JSON to receive a Date object in JavaScript?)
    问题 我有以下一段JSON: \/Date(1293034567877)\/ 这是此.NET代码的结果: var obj = DateTime.Now; var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); serializer.Serialize(obj).Dump(); 现在,我面临的问题是如何在JavaScript中从中创建Date对象。 我所能找到的就是令人难以置信的正则表达式解决方案(许多包含错误)。 很难相信没有完美的解决方案,因为这都是JavaScrip中的全部,我的意思是JavaScript代码试图读取应该被认为是JavaScript代码的JSON(JavaScript对象表示法),但现在看来,这并不是因为JavaScript无法在这里做好。 我还看到了一些我无法使用的评估解决方案(除了被指出为安全威胁之外)。 真的没有办法优雅地做到这一点吗? 没有实际答案的类似问题: 如何使用GWT解析ASP.NET JSON日期格式 回答1 没有日期的标准JSON表示形式。 您应该执行@jAndy建议的操作,而不要完全序列化DateTime ; 只需发送RFC 1123日期字符串ToString("r")或从Unix纪元开始的秒数
  • 如何格式化Microsoft JSON日期?(How do I format a Microsoft JSON date?)
    问题 我正在使用jQuery在Ajax上进行首次尝试。 我正在将数据获取到页面上,但是在为Date数据类型返回的JSON数据时遇到了一些麻烦。 基本上,我得到的字符串看起来像这样: /Date(1224043200000)/ 从完全陌生的人到JSON-如何将其格式化为短日期格式? 是否应该在jQuery代码中的某个地方处理? 我已经尝试使用$.datepicker.formatDate()使用jQuery.UI.datepicker插件,但没有成功。 仅供参考:这是我结合以下答案使用的解决方案: function getMismatch(id) { $.getJSON("Main.aspx?Callback=GetMismatch", { MismatchId: id }, function (result) { $("#AuthMerchId").text(result.AuthorizationMerchantId); $("#SttlMerchId").text(result.SettlementMerchantId); $("#CreateDate").text(formatJSONDate(Date(result.AppendDts))); $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts))); $(
  • 显示两个日期时间值之间的时差(以小时为单位)(Showing Difference between two datetime values in hours)
    问题 我正在从数据库中检索两个日期时间值。 检索到值后,我需要两个值之间的差异。 为此,我创建了一个timepan变量来存储两个日期值的差。 TimeSpan? variable = datevalue1 - datevalue2; 现在,我需要显示小时数中存储在Timespan变量中的差异。 我指的是TimeSpan.TotalHours,但由于某些原因无法应用相同的内容。 我怎么做? 我在MVC项目上使用C#。 我简单地需要显示小时数的差异值? 编辑:由于时间跨度是可为空的,所以我无法使用总小时数属性。 现在,我可以通过执行TimeSpanVal.Value.TotalHours来使用它; 回答1 我认为您很困惑,因为您尚未声明TimeSpan而是已经声明了TimeSpan? 这是一个可以为null的TimeSpan 。 如果您不需要问号可以为空,请删除它,或者使用variable.Value.TotalHours 。 回答2 您可能还想看看 var hours = (datevalue1 - datevalue2).TotalHours; 回答3 在示例中,我们正在创建两个日期时间对象,一个具有当前时间,另一个具有75秒的当前时间。 然后,我们将在第二个DateTime对象上调用方法.Subtract()。 这将返回一个TimeSpan对象。 一旦获得TimeSpan对象
  • ASP.NET MVC HandleError(ASP.NET MVC HandleError)
    问题 如何处理asp.net MVC Preview 5中的[HandleError]过滤器? 我在Web.config文件中设置了customErrors <customErrors mode="On" defaultRedirect="Error.aspx"> <error statusCode="403" redirect="NoAccess.htm"/> <error statusCode="404" redirect="FileNotFound.htm"/> </customErrors> 并将[HandleError]放在我的Controller类上方,如下所示: [HandleError] public class DSWebsiteController: Controller { [snip] public ActionResult CrashTest() { throw new Exception("Oh Noes!"); } } 然后,让我的控制器从此类继承并在它们上调用CrashTest()。 Visual Studio停止出现错误,并按f5键继续,然后重新路由到Error.aspx?aspxerrorpath = / sxi.mvc / CrashTest(其中sxi是使用的控制器的名称。当然,找不到该路径,我得到了“'/'应用程序中的服务器错误。” 404
  • Custom DateTime model binder in Asp.net MVC
    I would like to write my own model binder for DateTime type. First of all I'd like to write a new attribute that I can attach to my model property like: [DateTimeFormat("d.M.yyyy")] public DateTime Birth { get; set,} This is the easy part. But the binder part is a bit more difficult. I would like to add a new model binder for type DateTime. I can either implement IModelBinder interface and write my own BindModel() method inherit from DefaultModelBinder and override BindModel() method My model has a property as seen above (Birth). So when the model tries to bind request data to this property
  • 有关使用Ninject的问题(Questions about using Ninject)
    问题 我按照推荐的步骤操作,将Ninject添加到我的MVC应用程序中。 我在控制器的构造函数中添加了DbContext参数。 控制器: public class MyController : BaseController { public ArticlesController(MyDbContext context) : base(context) { } } 基本控制器: public class BaseController : Controller { protected DbContext MyDbContext; public BaseController(MyDbContext context) { MyDbContext = context; } } 这似乎运作良好。 但是,我还有几个问题。 Ninject是否确保及时清理和处置我的DbContext ? 我为所有应用程序的控制器创建了一个基类,以处理任何常见的初始化等。该基类在构造函数中接受我的DbContext参数的实例。 但这要求我也将此参数添加到应用程序中的每个控制器。 有什么方法可以不需要这个吗? 我不确定创建DbContext实例的成本是DbContext 。 有什么方法可以使优化仅在请求实际上需要我访问数据库时才创建。 回答1 Ninject是否确保及时清理和处置我的DbContext? 按照这个答案:
  • 从Javascript访问MVC的模型属性(Accessing MVC's model property from Javascript)
    问题 我的视图模型中包含以下模型 public class FloorPlanSettingsModel { public int Id { get; set; } public int? MainFloorPlanId { get; set; } public string ImageDirectory { get; set; } public string ThumbnailDirectory { get; set; } public string IconsDirectory { get; set; } } 如何从Javascript访问上述属性之一? 我尝试了这个,但是我得到了“未定义” var floorplanSettings = "@Model.FloorPlanSettings"; alert(floorplanSettings.IconsDirectory); 回答1 You could take your entire server-side model and turn it into a Javascript object by doing the following: var model = @Html.Raw(Json.Encode(Model)); In your case if you just want the FloorPlanSettings
  • Download Excel file via AJAX MVC(Download Excel file via AJAX MVC)
    问题 我在MVC中有一个大(ish)形式。 我需要能够生成一个Excel文件,其中包含来自该表单子集的数据。 棘手的一点是,这不应影响表单的其余部分,因此我想通过AJAX进行操作。 我遇到了一些关于SO的问题,这些问题似乎相关,但是我无法完全弄清楚答案的含义。 这似乎是我所追求的最接近的东西:asp-net-mvc-downloading-excel-但我不确定我是否知道响应,而且它已经存在了两年。 我还遇到了另一篇有关使用iframe来处理文件下载的文章(找不到该文章了),但是我不确定如何将其与MVC一起使用。 如果我正在做完整的回发,但是我的excel文件返回的很好,但是我无法在mvc中将其与AJAX一起使用。 回答1 您不能直接通过AJAX调用返回要下载的文件,因此,另一种方法是使用AJAX调用将相关数据发布到服务器。 然后,您可以使用服务器端代码来创建Excel文件(我建议为此使用EPPlus或NPOI,尽管听起来好像您正在使用此部分)。 2016年9月更新 我的原始答案(下)已经超过3年了,所以我想更新一下,因为通过AJAX下载文件时不再在服务器上创建文件,但是,我留下了原始答案,因为它可能仍会有所用,具体取决于您的具体要求。 在我的MVC应用程序中,常见的情况是通过网页进行报告,该网页具有一些用户配置的报告参数(日期范围,过滤器等)。
  • SQL查询以在SQL Server中插入日期时间(Sql query to insert datetime in SQL Server)
    问题 我想使用下面的SQL查询将datetime值插入表(SQL Server)中 insert into table1(approvaldate)values(18-06-12 10:34:09 AM); 但我收到此错误消息。 Incorrect syntax near '10'. 我用引号尝试过 insert into table1(approvaldate)values('18-06-12 10:34:09 AM'); 我收到此错误消息Cannot convert varchar to datetime 请帮助! 谢谢。 回答1 您将需要使用YYYYMMDD来确定SQL Server中的明确日期。 insert into table1(approvaldate)values('20120618 10:34:09 AM'); 如果您已采用dd-mm-yy hh:mm:ss xm格式,则需要使用具有特定样式的CONVERT。 insert into table1 (approvaldate) values (convert(datetime,'18-06-12 10:34:09 PM',5)); 5是意大利约会的风格。 好吧,不仅是意大利语,而且这是在线图书所赋予的文化。 回答2 字符串文字的一种与语言无关的选择是国际标准ISO 8601格式“ YYYY-MM-DDThh:mm