gpt4 book ai didi

c# - ViewModel 中对象的验证不添加 CSS 验证类

转载 作者:太空宇宙 更新时间:2023-11-03 14:07:51 25 4
gpt4 key购买 nike

我有以下 View 模型:

public class Search {
public int Id { get; set; }

[Required(ErrorMessage = "Please choose a name.")]
public string Name { get; set; }

[ValidGroup(ErrorMessage = "Please create a new group or choose an existing one.")]
public Group Group { get; set; }
}

public class Group {
public int Id { get; set; }
public string Name { get; set; }
}

我定义了一个自定义验证属性,如下所示:

public class ValidGroupAttribute : ValidationAttribute {
public override bool IsValid(object value) {
if (value == null)
return false;

Group group = (Group)value;

return !(string.IsNullOrEmpty(group.Name) && group.Id == 0);
}
}

我有以下看法(为简洁省略了一些):

    @Html.ValidationSummary()

<p>
<!-- These are custom HTML helper extensions. -->
@Html.RadioButtonForBool(m => m.NewGroup, true, "New", new { @class = "formRadioSearch", id = "NewGroup" })
@Html.RadioButtonForBool(m => m.NewGroup, false, "Existing", new { @class = "formRadioSearch", id = "ExistingGroup" })
</p>
<p>
<label>Group</label>
@if (Model.Group != null && Model.Group.Id == 0) {
@Html.TextBoxFor(m => m.Group.Name)
}
else {
@Html.DropDownListFor(m => m.Group.Id, Model.Groups)
}
</p>

我遇到的问题是验证类 input-validation-error 未应用于组输入。我认为这是因为框架试图找到一个带有 id="Group" 的字段,并且正在生成的标记有 id="Group_Id"id=群组名称。有什么方法可以申请类(class)吗?

http://f.cl.ly/items/0Y3R0W3Z193s3d1h3518/Capture.PNG

更新

我已经尝试在组 View 模型上实现 IValidatableObject 而不是使用验证属性,但我仍然无法应用 CSS 类:

public class Group : IValidatableObject
{
public int Id { get; set; }
public string Name { get; set; }

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (string.IsNullOrEmpty(Name) && Id == 0) {
yield return new ValidationResult("Please create a new group or select an existing one.", new[] { "Group.Name" });
}
}
}

更新2

self 验证不起作用。我认为这是因为 MVC 框架中未使用 ValidationResult 构造函数中的第二个参数。

发件人:http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2

In some situations, you might be tempted to use the second constructor overload of ValidationResult that takes in an IEnumerable of member names. For example, you may decide that you want to display the error message on both fields being compared, so you change the code to this:

return new ValidationResult(
FormatErrorMessage(validationContext.DisplayName), new[] { validationContext.MemberName, OtherProperty });

If you run your code, you will find absolutely no difference. This is because although this overload is present and presumably used elsewhere in the .NET framework, the MVC framework completely ignores ValidationResult.MemberNames.

最佳答案

我想出了一个可行的解决方案,但显然是一种变通方法。

我删除了验证属性并创建了一个自定义模型绑定(bind)器,它手动将错误添加到 Group.Name 属性的 ModelState 字典中。

public class SearchBinder : DefaultModelBinder {
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext,
PropertyDescriptor propertyDescriptor) {
if (propertyDescriptor.Name == "Group" &&
bindingContext.ValueProvider.GetValue("Group.Name") != null &&
bindingContext.ValueProvider.GetValue("Group.Name").AttemptedValue == "") {
ModelState modelState = new ModelState { Value = bindingContext.ValueProvider.GetValue("Group.Name") };
modelState.Errors.Add("Please create a new group or choose an existing one.");
bindingContext.ModelState.Add("Group.Name", modelState);
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}

// Register custom model binders in Application_Start()
ModelBinders.Binders.Add(typeof(SearchViewModel), new SearchBinder());

ModelState["Group.Name"] 现在有一个错误条目,CSS 类正在标记中呈现。

不过,如果有一种方法可以在 MVC 中使用惯用验证来做到这一点,我会更愿意。

已解决!

找到了一个合适的方法来做到这一点。我在自验证类中指定了错误的属性名称,因此添加到 ModelState 字典的键是 Group.Group.Name。我所要做的就是更改返回的 ValidationResult

yield return new ValidationResult("Please create a new group or select an existing one.", new[] { "Name" });

关于c# - ViewModel 中对象的验证不添加 CSS 验证类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8844222/

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