首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateTime的MVC模型绑定使用GET或POST是不同的

DateTime的MVC模型绑定使用GET或POST是不同的
EN

Stack Overflow用户
提问于 2013-10-10 09:59:19
回答 1查看 2.7K关注 0票数 6

在对某个DateTime模型属性使用“远程”验证属性时,我遇到了一些不必要的行为。

服务器端,我的应用程序文化定义如下:

代码语言:javascript
复制
protected void Application_PreRequestHandlerExecute()
{
    if (!(Context.Handler is IRequiresSessionState)){ return; }
    Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-BE");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-BE");
}

客户端,我的应用程序文化定义如下:

代码语言:javascript
复制
Globalize.culture("nl-BE");

案例1:

  • 模型性质 远程(“IsDateValid”,"Home")公共DateTime?MyDate { get;set;}
  • 控制器动作 公共信息系统( public JsonResult IsDateValid,DateTime?MyDate) { //这里的一些验证代码返回Json(true,JsonRequestBehavior.AllowGet);}
  • 在调试IsDateValid方法时,在UI中输入为05/10/2013的日期(2013年10月5日)被错误地解释为10/05/2013 (2013年5月10日)

案例2:

  • 模型性质 远程(“IsDateValid”,"Home",HttpMethod = "POST")公共DateTime?MyDate { get;set;}
  • 控制器动作 HttpPost JsonResult IsDateValid(DateTime?)MyDate) { //这里的一些验证代码返回Json(true);}
  • 在调试IsDateValid方法时,在UI中输入的日期为05/10/2013 (2013年10月5日),正确地将解释为05/10/2013 (2013年10月5日)

我是否缺少一些配置,使“标准”得到远程验证工作,如所需?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-29 11:49:10

当为GET绑定数据时,使用InvariantCulture (即"en-US"),而对于POST Thread.CurrentThread.CurrentCulture则使用。背后的原因是GET urls可能被用户共享,因此应该是不变的。而POST从来都不是共享的,使用服务器的区域性在那里绑定是安全的。

如果您确信您的应用程序不需要在来自不同国家的人之间共享urls,那么您可以安全地创建自己的ModelBinder,它将强制使用服务器区域设置,甚至对于GET请求也是如此。

下面是Global.asax.cs中的示例:

代码语言:javascript
复制
protected void Application_Start()
{
    /*some code*/

    ModelBinders.Binders.Add(typeof(DateTime), new DateTimeModelBinder());
    ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeModelBinder());
}

/// <summary>
/// Allows to pass date using get using current server's culture instead of invariant culture.
/// </summary>
public class DateTimeModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var date = valueProviderResult.AttemptedValue;

        if (String.IsNullOrEmpty(date))
        {
            return null;
        }

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

        try
        {
            // Parse DateTimeusing current culture.
            return DateTime.Parse(date);
        }
        catch (Exception)
        {
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format("\"{0}\" is invalid.", bindingContext.ModelName));
            return null;
        }
    }
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19292702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档