asp.net-mvc - 带有 JsonResult : ModelState is always valid 的 ASP.NET MVC 3

标签 asp.net-mvc modelstate

我正在尝试使用 ModelState 验证表单,但我的 ModelState 始终显示为有效。例如:当我尝试保存每个具有相同 SSN 的 2 Person formModel 时,ModelState 返回有效。我正在使用 IValidatableObject 来验证我的表单模型。任何想法我可能会出错吗?我正在使用 .Net 4.0 和 MVC 3。

public JsonResult LoadOccupantsDetailedInformation()
{
    //Load the personsFormModel with data
    return new JsonpResult(personsFormModel, JsonRequestBehavior.AllowGet);
}

[HttpPost]
public ActionResult SaveOccupantsDetailedInformation(
PersonsFormModel personsFormModel)
    {
//This line is always returning true even if I pass 2 persons with the same ssn
        if (ModelState.IsValid == false)
        {
            var errorList = ModelState.ToDictionary(
                      kvp => kvp.Key,
                      kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToArray()
                );
            return Json(new { Errors = errorList });
        }
        //Save the data in personsFormModel to database
        return Json(new JsonResultViewModel { Success = true });
    }


public partial class PersonsFormModel : List<PersonFormModel>, IValidatableObject
{
    public IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> Validate(
    ValidationContext validationContext)
    {
        var validationResults
            = new List<System.ComponentModel.DataAnnotations.ValidationResult>();
        if (this.SSNs.Count() > this.SSNs.Distinct().Count())
        {
            validationResults.Add(new System.ComponentModel.DataAnnotations.ValidationResult(
            "All the persons in the household should have a unique SSN\\ITIN number",
                new[] { "SSN" }));
        }
        return validationResults;
    }
    private IEnumerable<string> SSNs
    {
        get
        {
            return this.Select(element => element.SSN);
        }
    }
}
    public class PrequalifyOccupantListPersonDetailedFormModel
{
    [Required(ErrorMessage = "SSN is required")]
    public string SSN { get; set; }
}

最佳答案

我写了一个测试来验证你的验证,它看起来不错。

        [Test]
        public void Should_validate_person_form_model()
        {
            var input = new PersonsFormModel();
            input.Add(new PersonFormModel { SSN = "33" });
            input.Add(new PersonFormModel { SSN = "33" });
            _controller.ViewData.ModelState.Clear();

            var results = new List<ValidationResult>();

            bool isValid = Validator.TryValidateObject(input,
                new ValidationContext(input, null, null),
                results,true);

            Assert.IsTrue(!isValid, "Cannot have duplicates.");
        }

所以要么它没有被调用,要么你的数据有效。

要测试前者,您能否在 Validate 中放置一个断点并确认它被击中。

要测试后者,您能否提供发布的确切数据和涉及的完整模型。

关于asp.net-mvc - 带有 JsonResult : ModelState is always valid 的 ASP.NET MVC 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12633463/

相关文章:

entity-framework - ASP.NET MVC 4 ModelState 在传递 key 时无效

asp.net - 如何验证异步 Controller 中的模型状态

c# - 如果 IValidatableObject 不能用于执行对象的完整验证,那么 IValidatableObject 的 MVC 实现还有什么意义呢?

c# - 在 Asp.Net MVC Web Api 中测试 Controller 时,ModelState.IsValid 始终为真

asp.net-mvc - 测试 : Entity Framework by faking context

asp.net-mvc - 带有 Enum Kendo UI 的 DropDownList

c# - 在 ASP.NET 5 (vNext) 中获取配置值

c# - MVC 5 - 在登录时设置 session 变量

c# - 访问 select 中的透明标识符会引发它不是从范围引用的

model-view-controller - MVC 3 ModelState.IsValid 与多个 ViewModel