gpt4 book ai didi

asp.net-mvc - ASP.NET MVC - 复杂模型验证

转载 作者:行者123 更新时间:2023-12-01 16:26:06 26 4
gpt4 key购买 nike

我有一个像这样的 ViewModel 类:

class CaseModel {
public Boolean ClientPresent { get; set; }
public ClientModel Client { get; set; }
}

class ClientModel {
[Required]
public String FirstName { get; set; }
[Required]
public String LastName { get; set; }
}

查看页面由 <input type="checkbox" name="ClientPresent" /> 组成和一个 Html.EditorFor( m => m.Client )部分 View 。

这个想法是,当用户提供有关案例(业务域对象)的信息时,他们可以通过取消选中 ClientPresent 框来选择不指定有关客户(另一个业务对象)的任何信息。

我希望 ASP.NET MVC 不对子 ClientModel 对象执行任何验证 - 但是,当表单 POSTed 返回到服务器时,CaseModel.Client 属性会自动填充,但因为 FirstNameLastName不是(必然)由用户提供,这意味着它失败了 [Required]验证属性,因此 ViewData.ModelState.IsValid返回 false 并且用户收到验证错误消息。

我怎样才能得到它CaseModel.Client如果 CaseModel.ClientPresent 将不会被验证是假的吗?

请注意ClientModel是一个完全独立的 ViewModel 类,可在应用程序的其他地方使用(例如在 ClientController 类中,它允许用户编辑客户端的各个实例)。

最佳答案

我认识到我的问题与绑定(bind)无关,而实际上与验证有关:通过保留值,这意味着当用户重新加载页面时将填充相同的表单字段,我只需要在验证消息出现时将其丢弃不适用。

为此,我意识到我可以执行模型属性验证,但随后使用一些自定义逻辑来删除验证消息。这与我所做的类似:

public class CaseModel {
public void CleanValidation(ModelStateDictionary dict) {
if( this.ClientPresent ) {
dict.Keys.All( k => if( k.StartsWith("Client") dict[k].Errors.Clear() );
}
}
}

(显然我的实际代码更健壮,但你明白了总体思路)

CleanValidation 方法直接由 Controller 的操作方法调用:

public void Edit(Int64 id, CaseModel model) {
model.CleanValidation( this.ModelState );
}

我可能可以通过将 CleanValidation 作为方法添加到新接口(interface) IComplexModel 并让新的模型绑定(bind)器自动调用此方法来整理此问题,这样 Controller 就不会需要调用它本身。

更新:

我有这个接口(interface),适用于任何需要复杂验证的 ViewModel:

public interface ICustomValidation {

void Validate(ModelStateDictionary dict);
}

在我原来的示例中,CaseModel 现在看起来像这样:

 public class CaseClientModel : ICustomValidation {

public Boolean ClientIsNew { get; set; } // bound to a radio-button
public ClientModel ExistingClient { get; set; } // a complex viewmodel used by a partial view
public ClientModel NewClient { get; set; } // ditto

public void Validate(ModelStateDictionary dict) {

// RemoveElementsWithPrefix is an extension method that removes all key/value pairs from a dictionary if the key has the specified prefix.
if( this.ClientIsNew ) dict.RemoveElementsWithPrefix("ExistingClient");
else dict.RemoveElementsWithPrefix("NewClient");
}
}

验证逻辑由我的公共(public) BaseController 类中的 OnActionExecuting 调用:

protected override void OnActionExecuting(ActionExecutingContext filterContext) {
base.OnActionExecuting(filterContext);
if( filterContext.ActionParameters.ContainsKey("model") ) {

Object model = filterContext.ActionParameters["model"];
ModelStateDictionary modelState = filterContext.Controller.ViewData.ModelState; // ViewData.Model always returns null at this point, so do this to get the ModelState.

ICustomValidation modelValidation = model as ICustomValidation;
if( modelValidation != null ) {
modelValidation.Validate( modelState );
}
}
}

关于asp.net-mvc - ASP.NET MVC - 复杂模型验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11025959/

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