c# - MVC/JQuery驗證不接受逗號作為小數分隔符




asp.net-mvc asp.net-core (2)

即使有人提出,這是一個jQuery問題而不是MVC問題,我認為這是一個MVC問題。

不,那是不正確的。 您看到客戶端驗證錯誤,因為默認情況下, jquery.validate.js (與MicroSoft無關的獨立第三方插件,MVC用於客戶端驗證)根據小數分隔符為a驗證數字 . (點),而不是 , (逗號)。

MVC是服務器端代碼,不在瀏覽器中運行。 為了執行客戶端驗證,生成表單控件的MVC的 HtmlHelper 方法在html中呈現一組 data-val-* 屬性,用於描述要執行的驗證,這些屬性又由 jquery.validate.unobtrusive.js 插件解析加載DOM時,使用它們向 $.validator 添加規則。

double 屬性的情況下,它將添加 data-val-number 屬性(除了 data-val-required 屬性),這將添加定義為的 number 規則

// http://docs.jquery.com/Plugins/Validation/Methods/number
number: function( value, element ) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value);
},

其中小數點分隔符是一個點,千位分隔符是逗號(可能是因為該插件是在美國開發的,所以使用美國格式)。

您需要覆蓋使用 jquery.globalize 等插件或包含以下腳本可以執行的默認行為(請注意正則表達式只是交換點和逗號)

$.validator.methods.number = function (value, element) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)?(?:,\d+)?$/.test(value);
}

注意上面的腳本需要在 jquery.validate.js 腳本之後,但不包含在 $(document).ready()

將它與MVC聯繫起來的是,我可以通過將 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] 到模型中來解決日期驗證問題。

實際上你的 [DataType(DataType.Date)] 屬性與影響生成的html的 [DisplayFormat] 屬性一起使用。 [DataType] 屬性生成 <input type="date" ... /> ,如果瀏覽器支持,則會將瀏覽器HTML-5 datepicker呈現給它。 根據規範,格式必須是 yyyy-MM-dd (ISO格式),因此也需要 [DisplayFormat] 屬性。

HTML-5日期選擇器在瀏覽器文化中呈現日期。 輸入為 26.1.2018 是因為您的瀏覽器文化是 de-DE ,但如果我導航到您的網站,我會在輸入中看到 26/1/2018 ,因為我的文化是 en-AU (澳大利亞) ),如果美國用戶導航到您的網站,他們會看到 1/26/2018

客戶端驗證對date屬性起作用的原因是 jquery.validate.js 插件包含US格式( MM/dd/yyyy )和ISO格式( yyyy-MM-dd )的日期規則。

如果您要使用 @Html.TextBoxFor(m => m.Inbetriebnahmedatum) (忽略您的 [DataType][DisplayFormat] 屬性),並在輸入中輸入 26.1.2018 ,您還會看到客戶端驗證錯誤。

更新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")); }
}

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, "", new { @class = "text-danger" })
    </div>
</div>

Web.config文件

<globalization uiCulture="de-DE" culture="de-DE" />

加載後的框 - >用逗號作為小數分隔符加載的值

單擊提交按鈕後的框 - >相同值的驗證錯誤

逗號後的框更改為點 - >無驗證錯誤

更新05.01.2018

我嘗試過 here 顯示的解決方案,遺憾的是這對我不起作用。 但是,我還發現,這些值不僅不被接受,而且還被改為組分隔符和小數分隔符混合的數字(見圖)。 會發生的是,22的值變為22.5並存儲在數據庫中。 結果是,將值2,250.00存儲到數據庫中。

更新07.01.2018

同樣有趣的是,日期字段完全可以接受德語格式。

屬性

private DateTime? inbetriebnahmedatum;

[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? Inbetriebnahmedatum
{
    get { return inbetriebnahmedatum; }
    set { inbetriebnahmedatum = value; OnPropertyChanged(new PropertyChangedEventArgs("Inbetriebnahmedatum")); }
}

接受並處理下面顯示的值沒有任何錯誤。

更新07.01.2018 - 2

如果我更改edit.cshtml中的行

<input asp-for="Gewicht" class="form-control" />

<input name="Gewicht" id="Gewicht" type="number" class="form-control" value="@Model.Gewicht"/>

表單可以使用值“23,7”提交,不會出現驗證錯誤。 在控制器中,綁定模型屬性顯示值“237”,其中 IFormCollection 顯示值“23.7”。 這表明模型綁定器存在問題。


我認為問題是jquery驗證器我用它來解決逗號/點錯誤

$.validator.methods.number = function (value, element) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);
}

試試玩吧





asp.net-core