ASP.Net MVC3 通过或不通过 Visual Studio 修改日期和小数的区域性?
Posted
技术标签:
【中文标题】ASP.Net MVC3 通过或不通过 Visual Studio 修改日期和小数的区域性?【英文标题】:ASP.Net MVC3 Modify culture for date and decimal through or not Visual Studio? 【发布时间】:2011-04-21 12:58:17 【问题描述】:我正在使用 Razor 开发 MVC3 应用程序。我在使用日期和双打时遇到了麻烦。我的 Windows 和 Visual Studio 都是英文的,但我想在“it-IT”中自定义我的项目的文化。 我找到了几篇关于如何管理不同文化的文章,通过 JQuery Validation Plugin 或直接在页面上设置文化,但我很困惑! 我想用于日期的格式是“DD/MM/YYYY”,而双精度是 1.234,32。所以,
如何告诉 Visual Studio 如何使用这些格式(我检查了 Visual Studio 的设置,只有英文)? MVC 注入代码来验证我的字段,如何更改? 最好的方法是什么?显然,任何建议都会受到赞赏。 我发布我的项目代码:
Offerta.cs
[MetadataType(typeof(Offerta_Validation))]
public partial class Offerta
public class Offerta_Validation
[HiddenInput(DisplayValue = false)]
public int IDOfferta get; set;
[StringLength(300, ErrorMessage = "Campo troppo lungo")]
[Required(ErrorMessage = "Campo obbligatorio")]
public string Titolo get; set;
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "0:N2")]
[Required(ErrorMessage = "Campo obbligatorio")]
[Price(MinPrice=0.01)]
public decimal PrezzoIniziale get; set;
[Required(ErrorMessage = "Campo obbligatorio")]
[Integer]
public int BuoniScontiMinimo get; set;
public string Sconto get; set;
[Date]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "0:d")]
public System.DateTime DataAttivazione get; set;
[DataType(DataType.MultilineText)]
[Allowhtml]
public string Sintesi get; set;
[DataType(DataType.MultilineText)]
[Required(ErrorMessage = "Inserire le condizioni")]
[AllowHtml]
public string Condizioni get; set;
[DataType(DataType.MultilineText)]
[Required(ErrorMessage = "Inserire la descrizione")]
[AllowHtml]
public string Descrizione get; set;
“PrezzoIniziale”字段是 DB 上的双精度数。注释 [Price] 来自这篇文章http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx。这是我的看法:
@model ManagerEmail.Models.OffertaFormViewModel
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.global.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.glob.it-IT.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/tiny_mce/tiny_mce.js")"></script>
<script type="text/javascript">
tinyMCE.init(
// General options
mode: "textareas",
theme: "advanced",
plugins: "style,searchreplace,paste",
theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect",
theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,forecolor,backcolor,|,styleprops",
theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap,|,link,unlink,anchor,image,cleanup,help,code",
theme_advanced_toolbar_location: "top",
theme_advanced_toolbar_align: "left",
theme_advanced_statusbar_location : "bottom",
// Skin options
skin : "o2k7",
skin_variant : "silver",
width: "510",
height: "300",
object_resizing: false,
);
</script>
@using (Html.BeginForm(null, null, FormMethod.Post, new id = "editForm" ))
@Html.ValidationSummary(true)
<fieldset>
<legend></legend>
<ul>
<li>
@Html.LabelFor(model => model.Offerta.Titolo)
@Html.EditorFor(model => model.Offerta.Titolo) <br />
@Html.ValidationMessageFor(model => model.Offerta.Titolo)
</li>
<li>
@Html.LabelFor(model => model.Offerta.PrezzoIniziale, "Prezzo iniziale")
@Html.EditorFor(model => model.Offerta.PrezzoIniziale) <br />
@Html.ValidationMessageFor(model => model.Offerta.PrezzoIniziale)
</li>
<li>
@Html.LabelFor(model => model.Offerta.BuoniScontiMinimo, "Minimo Buoni")
@Html.EditorFor(model => model.Offerta.BuoniScontiMinimo) <br />
@Html.ValidationMessageFor(model => model.Offerta.BuoniScontiMinimo)
</li>
<li>
@Html.LabelFor(model => model.Offerta.Sconto)
@Html.EditorFor(model => model.Offerta.Sconto) <br />
@Html.ValidationMessageFor(model => model.Offerta.Sconto)
</li>
<li>
@Html.LabelFor(model => model.Offerta.DataAttivazione, "Data Attivazione")
@Html.EditorFor(model => model.Offerta.DataAttivazione) <br />
@Html.ValidationMessageFor(model => model.Offerta.DataAttivazione)
</li>
<li>
<label for="ddlAffiliato">Affiliato</label>
@Html.DropDownListFor(model => model.Offerta.Affiliato.IDAffiliato, new SelectList(Model.Affiliati, "IDAffiliato", "RagioneSociale"), new @id = "ddlAffiliato" )
</li>
<li>
@Html.LabelFor(model => model.Offerta.Condizioni) <br />
@Html.TextAreaFor(model => model.Offerta.Condizioni) <br />
@Html.ValidationMessageFor(model => model.Offerta.Condizioni, "", new style = "top: -30px; left: 210px" )
</li>
<li>
@Html.LabelFor(model => model.Offerta.Sintesi) <br />
@Html.TextAreaFor(model => model.Offerta.Sintesi) <br />
@Html.ValidationMessageFor(model => model.Offerta.Sintesi)
</li>
<li>
@Html.LabelFor(model => model.Offerta.Descrizione) <br />
@Html.TextAreaFor(model => model.Offerta.Descrizione) <br />
@Html.ValidationMessageFor(model => model.Offerta.Descrizione, "", new style = "top: -30px; left: 210px" )
</li>
</ul>
@Html.HiddenFor(model => model.Provincia.IDProvincia)
</fieldset>
<p>
@Html.AntiForgeryToken()
<input type="submit" value="Salva" id="submitButton"/>
</p>
<script type="text/javascript">
$("#Offerta_PrezzoIniziale").removeAttr("data-val-number"); //I forced this because MVC adds the data-val-number, so it doesn't accept double values :(
$(function ()
jQuery.global.preferCulture("it-IT");
);
$("#submitButton").click(function ()
tinyMCE.triggerSave();
);
</script>
<script type="text/javascript">
$(function ()
jQuery.validator.addMethod("price", function (value, element, params)
if (this.optional(element))
return true;
if (value > params.min)
var cents = value - Math.floor(value);
if (cents >= 0.99 && cents < 0.995)
return true;
return false;
);
);
</script>
这是我的 FormViewModel
public class OffertaFormViewModel
public Provincia Provincia get; set;
public Offerta Offerta get; set;
public IEnumerable<Affiliato> Affiliati get; set;
谢谢!
【问题讨论】:
看看这篇文章:***.com/questions/5300525/… 【参考方案1】:添加
<globalization culture="it-IT"/>
在 system.web 部分下的 web.config 中,做这个技巧吗?
编辑:
添加相关的 MSDN 链接 http://msdn.microsoft.com/en-us/library/bz9tc508.aspx
【讨论】:
我在 web.config 上添加了这一行,但验证器仍然触发..为什么?!!?我尝试使用类似 8,34 的值。我还添加了属性 uiCulture="it-IT"。 @stuzzo 这应该有效。嗯……一定有别的事情发生了。您收到的错误信息是什么?两个建议来查明问题。使用标准 ASP.NET [Range] 属性而不是 [Price] 属性进行测试。建议 2 - 尝试调试 PriceAttribute 类的 IsValid() 方法,以查看哪一行返回了验证错误。这可能会给我们更多的想法来缩小原因。 我在同一点上。无论有没有 [Price] 属性,如果我设置了一个像 3,49 这样的值,消息错误是“字段 InitialPrice 必须是一个数字”。我不知道...所以 IsValid() 方法永远不会触发,它会在之前停止。【参考方案2】:你的问题有点不清楚。据我所知,您希望您的应用程序以正确的文化显示,而不是您的 Visual Studio。
要设置日期和双重格式(即文化),您可以在应用程序 Global.asax Application_Start() 事件中执行以下操作:
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("it-IT");
【讨论】:
您好,感谢您的回答。我添加这两行 System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("it-IT"); System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("it-IT");,但它不起作用。如果我尝试定义像 23,03 这样的价格,验证器会触发消息“PrezzoIniziale 字段必须是一个数字(非常丑陋:( )”。 好奇... Application_Start() 只会在应用程序启动时运行一次。我猜想设置文化只会为正在执行 Application_Start() 的线程设置它,而不是为后续的 HTTP 请求设置它。想法?以上是关于ASP.Net MVC3 通过或不通过 Visual Studio 修改日期和小数的区域性?的主要内容,如果未能解决你的问题,请参考以下文章
使用razor/asp.net mvc3生成静态html页面?