加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – MVC如何忽略嵌套视图模型的验证

发布时间:2020-12-16 07:24:00 所属栏目:asp.Net 来源:网络整理
导读:我有一个页面,我将两个视图模型发布到控制器,查询和约会.约会在查询中嵌套.用户可以选择在不创建约会的情况下向我们提交查询. 我在视图模型属性上使用内置的MVC必需属性. 我的问题是,当用户选择在没有约会的情况下创建查询时,如何优雅地忽略嵌套的约会视图模
我有一个页面,我将两个视图模型发布到控制器,查询和约会.约会在查询中嵌套.用户可以选择在不创建约会的情况下向我们提交查询.

我在视图模型属性上使用内置的MVC必需属性.

我的问题是,当用户选择在没有约会的情况下创建查询时,如何优雅地忽略嵌套的约会视图模型上的验证器并让ModelState.IsValid返回true?

if(!viewModel.CreateAppointment)
            {
                //ignore the nested view models validation                            
            }

解决方法

您可以创建一个自定义的IgnoreModelError属性,如下所示,并在视图中使用2个单独的按钮,一个用于查询,另一个用于约会.

// C#
public class IgnoreModelErrorAttribute : ActionFilterAttribute
{
    private string keysString;

    public IgnoreModelErrorsAttribute(string keys)
        : base()
    {
        this.keysString = keys;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ModelStateDictionary modelState = filterContext.Controller.ViewData.ModelState;
        string[] keyPatterns = keysString.Split(new char[] { ',' },StringSplitOptions.RemoveEmptyEntries);
        for (int i = 0; i < keyPatterns.Length; i++)
        {
            string keyPattern = keyPatterns[i]
                .Trim()
                .Replace(@".",@".")
                .Replace(@"[",@"[")
                .Replace(@"]",@"]")
                .Replace(@"[]",@"[[0-9]+]")
                .Replace(@"*",@"[A-Za-z0-9]+");
            IEnumerable<string> matchingKeys = _
               modelState.Keys.Where(x => Regex.IsMatch(x,keyPattern));
            foreach (string matchingKey in matchingKeys)
                modelState[matchingKey].Errors.Clear();
        }
    }
}


[HttpPost]
[IgnoreModelErrors("Enquiry.Appointment")]
public ActionResult CreateEnquiryOnly(Enquiry enquiry)
{
    // Code for enquiry only.
}

[HttpPost]
public ActionResult CreateAppointment(Enquiry enquiry)
{
    // Code for appointment.
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读