Asp.net-MVC现在允许隐式绑定DateTime对象.我有一个行动
public ActionResult DoSomething(DateTime startDate)
{
...
}Run Code Online (Sandbox Code Playgroud)
这成功地将字符串从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的默认模型绑定器中使用的日期格式?默认型号绑定器不应该使用您的本地化设置吗?
我翻译了我的mvc网站,这个网站运行得很好.如果我选择其他语言(荷兰语或英语),内容将被翻译.这是有效的,因为我在会话中设置了文化.
现在我想在网址中显示所选文化(=文化).如果它是默认语言,则不应在网址中显示,只有当它不是默认语言时才应在网址中显示.
例如:
对于默认文化(荷兰语):
site.com/foo
site.com/foo/bar
site.com/foo/bar/5
Run Code Online (Sandbox Code Playgroud)
对于非默认文化(英语):
site.com/en/foo
site.com/en/foo/bar
site.com/en/foo/bar/5
Run Code Online (Sandbox Code Playgroud)
我的问题是我总是看到这个:
site.com/ nl/foo/bar/5即使我点击了英文(参见_Layout.cs).我的内容是用英文翻译的,但网址中的路由参数仍然是"nl"而不是"en".
我怎样才能解决这个问题或者我做错了什么?
我尝试在global.asax中设置RouteData但没有帮助.
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("favicon.ico");
routes.LowercaseUrls = true;
routes.MapRoute(
name: "Errors",
url: "Error/{action}/{code}",
defaults: new { controller = "Error", action = "Other", code = RouteParameter.Optional }
);
routes.MapRoute(
name: "DefaultWithCulture",
url: "{culture}/{controller}/{action}/{id}",
defaults: new { culture = "nl", controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { culture = "[a-z]{2}" } …Run Code Online (Sandbox Code Playgroud) ASP.NET MVC中的模型绑定很棒,但它遵循区域设置.在我的语言环境中,小数点分隔符是逗号(','),但用户也使用点('.'),因为它们懒得切换布局.我想在一个地方为decimal我的模型中的所有字段实现这个.
我应该为decimal类型实现自己的Value Provider(或事件Model Binder),还是我错过了一些简单的方法来做到这一点?
我试图弄清楚为什么框架拒绝将"1,234.00"值绑定到十进制.它可能是什么原因?
像"123.00"或"123.0000"这样的值绑定成功.
我有以下代码在Global.asax中设置我的文化配置
public void Application_AcquireRequestState(object sender, EventArgs e)
{
var culture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
culture.NumberFormat.NumberDecimalSeparator = culture.NumberFormat.CurrencyDecimalSeparator = culture.NumberFormat.PercentDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = culture.NumberFormat.CurrencyGroupSeparator = culture.NumberFormat.PercentGroupSeparator = ",";
Thread.CurrentThread.CurrentCulture = culture;
}
Run Code Online (Sandbox Code Playgroud)
法国文化在Web.Config中被设置为默认文化
<globalization uiCulture="fr-FR" culture="fr-FR" />
Run Code Online (Sandbox Code Playgroud)
我潜入了System.Web.Mvc.dll的ValueProviderResult类的源代码.它使用的是System.ComponentModel.DecimalConverter.
converter.ConvertFrom((ITypeDescriptorContext) null, culture, value)
Run Code Online (Sandbox Code Playgroud)
这是消息"1,234.0000不是十进制的有效值".来自.
我试图在我的操场上运行以下代码:
static void Main()
{
var decConverter = TypeDescriptor.GetConverter(typeof(decimal));
var culture = new CultureInfo("fr-FR");
culture.NumberFormat.NumberDecimalSeparator = culture.NumberFormat.CurrencyDecimalSeparator = culture.NumberFormat.PercentDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = culture.NumberFormat.CurrencyGroupSeparator = culture.NumberFormat.PercentGroupSeparator = ",";
Thread.CurrentThread.CurrentCulture = culture;
var d1 = Decimal.Parse("1,232.000");
Console.Write("{0}", d1); …Run Code Online (Sandbox Code Playgroud) 更新07.01.2018
即使有人提出,这是一个jQuery问题而不是MVC问题,我认为这是一个MVC问题.我已经在asp.net core 2.0 MVC中创建了整个应用程序并且错误仍然存在.将它与MVC联系起来的是,我可以通过向[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]模型添加行来解决日期验证问题.因此,MVC对验证有影响.所以我会假设有在MVC某种方式来解决这个问题(见这个职位).请发布asp.net core 2.0的答案.
原帖
在MVC5页面中,我Double在文本框中渲染一个属性.加载页面时,该值显示为","作为小数分隔符,这是正确的,因为页面在德语系统上运行.如果我想保存表单,我会收到验证错误.怎么解决这个问题?我知道关于这个话题有一些问题,但据我所知,其中大部分已经过时了...我仍然在苦苦挣扎,没有设置或任何内置的东西允许来自不同国家的用户使用MVC应用程序.
模型:
[DisplayFormat(DataFormatString = "{0:n2}", ApplyFormatInEditMode = true)]
public Double Gewicht
{
get { return gewicht; }
set { gewicht = value; OnPropertyChanged(new PropertyChangedEventArgs("Gewicht")); }
}
Run Code Online (Sandbox Code Playgroud)
CSHTML:
<div class="form-group">
@Html.LabelFor(model => model.Gewicht, htmlAttributes: new { @class = "control-label col-md-3" })
<div class="col-md-8">
@Html.EditorFor(model => model.Gewicht, new { htmlAttributes = new { @class = "form-control col-md-1" } })
@Html.ValidationMessageFor(model => model.Gewicht, "", …Run Code Online (Sandbox Code Playgroud) 我的语言环境使用逗号,,而不是.小数点分隔符的点.
在MVC3中,当我打开一个显示小数值的编辑视图时
@Html.EditorFor(model => model.MyDecimalVal)
Run Code Online (Sandbox Code Playgroud)
值正确显示.
当我用逗号输入值时,我得到错误"值不是数字",如果我用点输入值,我没有错误,但实际上没有保存任何值.
如何处理这种情况?
我正在使用NerdDinner示例应用程序并到达处理Virtual Earth地图的部分.应用程序存储经度和纬度的一些值.不幸的是,在我的系统上,浮点数用逗号作为小数分隔符存储,而不是像美国那样的点.因此,如果我的纬度为47.64,则将其检索并显示为47,64.因为该值在函数调用中传递给Virtual Earth API,所以它在那时失败(例如JavaScript API期望47.64,-122.13,但得到47,64,-122,13).
我需要确保应用程序始终使用点.在WebForms应用程序中,我将有一个覆盖该System.Web.UI.Page.InitializeCulture()方法的公共类,我将从该类继承我的页面.
我不确定如何对MVC做同样的事情.我需要定制ViewPage或什么?有没有简单的方法来解决这个问题?例子?
asp.net-mvc ×7
c# ×3
localization ×2
.net ×1
asp.net-core ×1
datetime ×1
decimal ×1
formatting ×1
jquery ×1
modelbinders ×1