gpt4 book ai didi

asp.net-mvc-3 - Html.ValidationSummary(true) 不显示 Ivalidatable 错误

转载 作者:行者123 更新时间:2023-12-02 03:23:18 27 4
gpt4 key购买 nike

我有一个带有 Html.ValidationSummary(true) 标记的 Razor View 。

属性级别验证执行正常,消息显示在错误字段旁边。但是,对于通过实现 IValidatable 的 Validate 方法进行验证,我遇到了问题。

如果模型本身实现了 IValidatable,则错误将添加到模型状态并正确显示在 Html.ValidationSummary(true) 标记中(模型级别错误而不是属性级别)但是,如果 View 模型包含对复杂对象的引用(用 [Required] 注释装饰),则不会显示该消息。它被添加到 ModelState 并且 isValid 正确地变为 false。它位于错误列表中,显示为模型级错误,但不显示。 (如果您使用 Html.ValidationSummary(false),则会显示该消息)。

这根本不可行吗?难道我做错了什么?正在讨论转向 Fluent,但这又是更多工作......

下面是代码示例:查看模型:

public class ViewModel
{
[Required]
public TestModel DataModel { get; set; }
}

测试模型:

public class TestModel : IValidatableObject
{

[Display(ResourceType = typeof(ViewResources), Name = "Field1")]
public string Field1 { get; set; }
public string Field2 { get; set; }

[Required]
public string Field3 { get; set; }

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{

if (string.IsNullOrEmpty(Field1) && string.IsNullOrEmpty(Field2))
{
yield return new ValidationResult("Need to enter either Field1 or Field2.");
}
}
}

Razor View :

@using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "createDialog" }))
{
@Html.ValidationSummary(true)

<fieldset>
<div class="editor-label">
@Html.LabelFor(model => model.DataModel.Field1)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DataModel.Field1)
@Html.ValidationMessageFor(model => model.DataModel.Field1)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.DataModel.Field2)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DataModel.Field2)
@Html.ValidationMessageFor(model => model.DataModel.Field2)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.DataModel.Field3)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DataModel.Field3)
@Html.ValidationMessageFor(model => model.DataModel.Field3)
</div>

<p>
<input type="submit" value="Submit"/>
</p>
</fieldset>

Controller :

if (!ModelState.IsValid) return View();
return View();

最佳答案

不是一个干净的实现,但您仍然可以使用它。

if (!ModelState.IsValid)
{
System.Web.Mvc.ModelState modelStateObj = new ModelState();
bool isModelStateAvailable = ModelState.TryGetValue("DataModel", out modelStateObj);
if (isModelStateAvailable)
{
ModelState.Remove("DataModel");
modelStateObj.Errors.ToList().ForEach(t => { ModelState.AddModelError(string.Empty, t.ErrorMessage); });
}
}

关于asp.net-mvc-3 - Html.ValidationSummary(true) 不显示 Ivalidatable 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com