我使用MVC5,我有一個視圖模型爲我的視圖,其中包含一個簡單的形式與以下字段:如何在運行時使用jQuery更改MVC自定義客戶端驗證錯誤消息?
MinFirstNameLength
FirstName
MinLastNameLength
LastName
現在,我想申請上FirstName
驗證規則的基礎上的價值,以及類似的LastName
使用MinLastNameLength
。我也想在客戶端做到這一點。
所以,我用MVC的不顯眼的客戶端驗證功能。我做了一個自定義驗證屬性,實現了IClientValidatable
接口。該方法GetClientValidationRules
看起來像這樣:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
string ErrorMessage = ErrorMessageString;
ModelClientValidationRule NameMinLengthRule = new ModelClientValidationRule();
NameMinLengthRule.ErrorMessage = ErrorMessage;
NameMinLengthRule.ValidationType = "nameminlength";
NameMinLengthRule.ValidationParameters.Add("minlengthpropname", MinLengthPropName);
yield return NameMinLengthRule;
}
此驗證屬性施加在FirstName
和LastName
性質是這樣的:
[NameMinLength("FirstNameMinLength",ErrorMessage = "First Name must be at least {0} characters"]
public string FirstName { get; set; }
[NameMinLength("LastNameMinLength",ErrorMessage = "Last Name must be at least {0} characters"]
public string LastName { get; set; }
另外,我的客戶端驗證功能在.js文件中別處,它看起來像這樣:
$.validator.addMethod("nameminlength",
function (
value,
element,
params
) {
return value.length >= parseInt($(params).val());
});
$.validator.unobtrusive.adapters.add("nameminlength", ["minlengthpropname"], function (options) {
var paramField = "#" + options.params.minlengthpropname;
options.rules["nameminlength"] = paramField;
var errormessage = options.message;
options.messages["nameminlength"] = errormessage;
});
我的問題是,我該如何在文本框中指定值MinFirstNameLength
到佔位符{0}
在我的錯誤消息爲FirstName
,以便錯誤消息讀取First Name must be at least [value] characters
?
我嘗試添加修改我$.validator.unobtrusive.adapters.add
方法如下:
$.validator.unobtrusive.adapters.add("nameminlength", ["minlengthpropname"], function (options) {
var paramField = "#" + options.params.minlengthpropname;
options.rules["nameminlength"] = paramField;
var errormessage = options.message;
options.messages["nameminlength"] = errormessage;
$(paramField).blur(function() {
// change error message in the 'data-val-nameminlength' attribute of the HTML element on which validation is applied
var newErrorMessage = options.messages["nameminlength"].replace("{0}", $(paramField).val());
$(options.element).attr("data-val-nameminlength", newErrorMessage);
// change error message inside the error message span generated for displaying this error
$(options.element).siblings(".field-validation-valid").html(newErrorMessage);
});
});
但無論這些把戲沒有奏效。 HTML標記確實發生了變化,可以適當修改錯誤,但這種更改並未反映在頁面中。
目前,該錯誤消息我看到的是:
First Name must be at least #FirstNameMinLength characters
佔位符由被用作驗證規則的參數的控件的ID自動替換。
此錯誤消息來自哪裏?如何在運行時修改它?
在「IsValid」方法內部格式化錯誤消息會破壞客戶端驗證的整個目的。我希望能夠根據用戶輸入更改客戶端本身的錯誤消息,並保存服務器行程。所以我認爲我必須在JavaScript代碼中做一些事情。但是什麼? 此外,我想根據用戶輸入進行驗證。我正在做的實際事情有點複雜。我在這裏描述的只是我創建的一個例子來說明我正面臨的確切問題。 –
@AmateurProgrammer請參閱我的答案更新,做了一個具有類似屬性的簡單測試,它在客戶端進行驗證時將文本框中的值替換爲{0}。 –
@MaksymStrukov類似的問題,我試過你的方法,但我的錯誤被驗證器的內部重寫:$ .validator.format(message.replace(theregex,「{$ 1}」),rule.parameters);這將{0}更改爲[對象對象],其餘錯誤消息顯示。 – Vyache