ASP.Net MVC3 Изменить культуру для даты и десятичной дроби через Visual Studio или нет? - PullRequest
9 голосов
/ 21 апреля 2011

Я работаю над приложением MVC3 с Razor.У меня проблемы с использованием дат и двойников на мои взгляды.И моя Windows, и Visual Studio - английские, но я хочу настроить культуру своего проекта в "it-IT".Я нашел несколько статей о том, как управлять разными культурами, через плагин JQuery Validation или непосредственно устанавливая культуру на странице, но я сильно запутался !!!Формат, который я хочу использовать для дат: «ДД / ММ / ГГГГ», а для двойного - 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» является двойным на БД.Аннотация [Цена] получена из этого поста 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; }
    }

Спасибо!

Ответы [ 3 ]

5 голосов
/ 21 апреля 2011

Помогает ли добавление

<globalization culture="it-IT"/>

в вашем web.config в разделе system.web?

Редактировать:

Добавление соответствующей ссылки MSDN http://msdn.microsoft.com/en-us/library/bz9tc508.aspx

5 голосов
/ 21 апреля 2011

Сталкивались ли вы с той же проблемой, которую Хаак освещает в своем блоге?

http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx

0 голосов
/ 21 апреля 2011

Ваш вопрос немного неясен. Насколько я понимаю, вы хотите, чтобы ваше приложение отображалось в правильной культуре, а не в Visual Studio.

Чтобы установить дату и двойной формат (например, культура), вы должны сделать что-то подобное в своих приложениях. Global.asax Application_Start () событие:

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("it-IT");
...