我需要修改网站上的验证消息。原因是(可能不好)我们采取了捷径。我们将编写Custom ModelBinder的代码。不过,我会揭露我的问题。
在View文件中,我们添加了几个隐藏的输入字段,并使用Model Binder,在控制器中,我们得到两个实体(一个是视图文件的模型,另一个是通过隐藏的输入字段创建的)< / p>
<input type="text" name = "FromHiddenInputs.Name" value="" />
<input type="hidden" name ="FromHiddenInputs.Id" value="0" />
请注意,FromHiddenInputs不属于我的@Model。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Entity MyModel, SecondEntity FromHiddenInputs)
{
if (ModelState.IsValid){
在调试模式下处理表单发布结果的方法。当我查看ModelState时,我看到两个实体都存在一些验证错误。
因此在视图文件中,使用此代码,我可以显示验证消息:
@Html.ValidationMessageFor(model => model.MyProperty)
或
@Html.ValidationMessage("FromHiddenInputs.Name", "*")
所以我的问题如下,ModelState的错误和验证如何从ActionResult传递到viewfile?
答案 0 :(得分:1)
由于验证过程较早前由ModelBinder
执行,因此错误数据已存在于ModelState.Values
中。
现在ValidationMessageFor
辅助方法所要做的就是从它的ViewData.ModelState.Values
集合中提取数据。
答案 1 :(得分:1)
模型验证消息是从模型属性生成的,由 jquery unobtrusive validation 生成,没有完全回发,但如果不包含它,则完成回发并由 jquery生成消息验证 js文件。
在 jquery unobtrusive-validate.js 中有一个onError方法,当有验证错误时调用它,它检查每个元素并从Model Property生成错误消息并使它们可见。
以下是 jquery-unobtrusive-validate.js 中的方法:
function onError(error, inputElement) { // 'this' is the form element
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false;
container.removeClass("field-validation-valid").addClass("field-validation-error");
error.data("unobtrusiveContainer", container);
if (replace) {
container.empty();
error.removeClass("input-validation-error").appendTo(container);
}
else {
error.hide();
}
}