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 修改日期和小数的区域性?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC3 - 将剃刀标记作为参数传递

Asp.Net MVC3 简单入门详解过滤器Filter

使用razor/asp.net mvc3生成静态html页面?

IIS7.5 中的 ASP.NET MVC3 401.1 错误

Asp.Net MVC3.0网站统计登录认证的在线人数

如何在 ASP.NET MVC3 中通过 HTTPS 提供静态文件(在 ~/Content 中)