【问题标题】:comma decimal seperator in asp.net mvc 5 [duplicate]asp.net mvc 5中的逗号小数分隔符[重复]
【发布时间】:2015-09-22 15:00:01
【问题描述】:

我拼命尝试让 asp.net 使用逗号符号作为小数分隔符,但这似乎比必要的要困难得多......

我已经完成了本教程中的所有内容http://www.asp.net/mvc/overview/getting-started/introduction/examining-the-edit-methods-and-edit-view

在根网络配置中尝试过这个

<system.web>
    <globalization culture="de-DE" uiCulture="de-DE" />
</system.web>

逐步浏览 jQuery 代码 - 那里的全球化似乎奏效了。

我正在使用带有模型视图控制器的 get 请求,看起来像这样

public class SearchCalcViewModel
{
        public SearchCalcViewModel() { }

        public IEnumerable<Calculation> Calculations { get; set; }
        [Display(Name="Name")]
        public string Name { get; set; }
        [Display(Name="Height")]
        public decimal? Height { get; set; }
}

get 请求是在主控制器中调用的——这加强了我的假设,即 jquery 文化相关的验证正在工作,并且 .net 文化中的某些东西是错误的,即使 Thread.CurrentTHread.CurrentCulture / CurrentUICulture 也设置正确。

当我尝试填写 3,0 作为高度时,我收到以下错误消息:

值“3,0”对高度无效。

这是我观点的重要部分:

@using (Html.BeginForm("Search", "Main", FormMethod.Get))

<div class="form-group">
         @Html.LabelFor(m => m.Height, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
             @Html.TextBoxFor(m => m.Height, new { @class = "form-control"})
             @Html.ValidationMessageFor(m => m.Height)
        </div>
     </div>
}

这是我的主控制器:

public ActionResult Search(SearchCalcViewModel searchViewModel)
    {
        searchViewModel.Products = db.Products;
        searchViewModel.Calculations = from c in db.Calculations select c;


        if (searchViewModel.Height.HasValue)
        {
            searchViewModel.Calculations =  searchViewModel.Calculations.Where(c => c.Length == searchViewModel.Height);
        }


        return View(searchViewModel);
    }

我已经进入了模型状态,但文化与我目前的文化有所不同

【问题讨论】:

  • 你有什么问题。您是否收到客户端验证错误(并且表单未提交)
  • 正如我所说,get 请求是在我的控制器中调用的,所以据我所知它不可能是客户端验证错误?如果我错了,请纠正我
  • 那么问题出在哪里? - 您没有显示您的视图或您的控制器方法或指示您的错误(有错误吗?)发生的位置。您的实际问题是什么?
  • 我编辑了我原来的问题更清楚
  • 您能否暂时禁用客户端验证(在视图中添加@ { HtmlHelper.ClientValidationEnabled = false; HtmlHelper.UnobtrusiveJavaScriptEnabled = false; } 以确认这是服务器端问题。

标签: c# jquery asp.net asp.net-mvc globalization


【解决方案1】:

您的值是3,0,它不是有效的十进制类型值。应该是3.0替换" comma(,) with dot(.)

编辑:创建您自己的模型绑定器。

public class DecimalModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        return valueProviderResult == null ? base.BindModel(controllerContext, bindingContext) : Convert.ToDecimal(valueProviderResult.AttemptedValue);

    }    
}

在 Application_Start 文件中添加这些行。

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());

我认为现在应该可以了。 :)

【讨论】:

  • 它在德国/奥地利。这是一个本地化问题。
  • 这意味着您希望接受值为 3,0.. Ryt??那么请立即查看我的编辑。希望对您有所帮助。
  • 奇怪的是这不能开箱即用......但感谢您的回答!我快疯了。
【解决方案2】:

我知道它很旧,但我遇到了同样的问题(使用 es-AR),我找到了更好的解决方案,您可以简单地这样做:

void Application_AcquireRequestState(object sender, EventArgs e)
{
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(HttpContext.Current.Session["userCulture"]);
    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(HttpContext.Current.Session["userCulture"]);
}

在 Global.asax 上

此代码在模型绑定之前运行,因此您可以将文化信息设置到线程,并且您可以访问会话变量(针对特定的用户文化)

【讨论】:

  • 如果您这样做,您将在对您的应用程序发出的每个请求上切换语言。
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2018-12-06
  • 2017-09-28
  • 1970-01-01
相关资源
最近更新 更多