mvc c#,自定义属性在发布错误时导致无限循环

时间:2017-05-11 12:43:23

标签: c# asp.net-mvc custom-attribute

我有这个自定义属性:

public class CountAttribute : ValidationAttribute
    {
        public string Number1 { get; set; }
        public string Number2 { get; set; }

        public CountAttribute()
        {

        }

        public CountAttribute(string ErrorMessage, string Number1, string Number2)
        {
            this.Number1 = Number1;
            this.Number2 = Number2;
            this.ErrorMessage = ErrorMessage;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var propertyNumber1 = validationContext.ObjectType.GetProperty(Number1);
            int number1 = (int)propertyNumber1.GetValue(validationContext.ObjectInstance);
            var propertyNumber2 = validationContext.ObjectType.GetProperty(Number2);
            int number2 = (int)propertyNumber2.GetValue(validationContext.ObjectInstance);
            if (number1 + number2 != (int)value)
            {
                return new ValidationResult(ErrorMessage);
            }
            return ValidationResult.Success;
        }
    }

在布局上我有模态窗口呈现的动作,这样(无限循环会崩溃):

<div id="loginBox" class="modal-z">
    @{ Html.RenderAction("Login", "Account"); }
</div>

当自定义属性被注释或模型有效时,表单帖子可以正常工作。

当我发布有错误的表单时,它会正确地重新显示模型,但是当我再次发布它(有效或无效)时,它会被循环堆叠。在RenderAction(登录)上写入此错误:

  

堆栈不足以安全地继续执行程序。这个可以   因为在调用堆栈或函数上有太多函数而发生   堆栈使用了太多的堆栈空间。

如何解决这个问题?

修改

        [AllowAnonymous]
        public PartialViewResult Login(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            return PartialView();
        }

        [HttpPost]
        [AllowAnonymous]
        public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
        {
            if (!ModelState.IsValid)
            {
                return PartialView(model);
            }
            var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

            switch (result)
            {
                case SignInStatus.Success:
                   // some redirect logic
                default:
                    ModelState.AddModelError("", "Invalid login.");
                    return PartialView(model);
            }
        }

0 个答案:

没有答案
相关问题