Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 型号为isn&x27;t验证_C#_Asp.net_Asp.net Mvc_Validation_Model - Fatal编程技术网

C# 型号为isn&x27;t验证

C# 型号为isn&x27;t验证,c#,asp.net,asp.net-mvc,validation,model,C#,Asp.net,Asp.net Mvc,Validation,Model,因此,当为我的模型输入文本时,它总是有效的,即使我明确要求它有一个minLength,尽管它是空的或小于minLength 型号: public class CommentaarCreate_VM { public Stad Stad { get; set; } [Required] public Commentaar Commentaar { get; set; } } public class Commentaar { [Key] public int

因此,当为我的模型输入文本时,它总是有效的,即使我明确要求它有一个minLength,尽管它是空的或小于minLength

型号:

public class CommentaarCreate_VM
{
    public Stad Stad { get; set; }
    [Required]
    public Commentaar Commentaar { get; set; }
}
public class Commentaar
{
    [Key]
    public int CommentaarId { get; set; }
    [Required]
    public string UserId { get; set; } 
    [Required]
    public int StadId { get; set; }
    [Required(AllowEmptyStrings=false, ErrorMessage="You need to enter a comment of valid length")]
    [MinLength(5, ErrorMessage ="You need to enter a comment of valid length")]
    public string CommentaarText { get; set; }
    [Required]
    [DataType(DataType.DateTime)]
    public DateTime Tijdstip { get; set; }
}
视图:

有什么我遗漏的吗?我以为所有的工作,除了DataAnnotation,都是由MVC完成的?

您的输入是:

<input asp-for="Commentaar" class="form-control" />
你的意见是:

<input asp-for="Commentaar" class="form-control" />

一个好的做法是在post方法上使用
ModelState.IsValid
,以便检查正在发送的模型的属性。也就是说,ModelState.IsValid检查您在模型上编写的数据注释

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind("CommentaarText, Tijdstip")] int id, IFormCollection collection) //Bind = protect from overposting
    {
         if(ModelState.IsValid)
         {
             //If it is valid, do all your business logic, like creating a new entry.
         }
         else
         {
             //Handle it
             return View();
         }
    }
另一件事是,我看到您使用了
ViewModels
,这很好。因此,您可以将viewmodel作为操作的参数发送。你可以这样做:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(CommentaarCreate_VM viewmodel)
    {
          if(ModelState.IsValid)
          {
               //It is valid
               //All your logic
          }
          else
          {
               //Not valid
               return View(Viewmodel model)
          }         
    }
通过这样做,您必须向
CommentaarCreate\u VM

  public class CommentaarCreate_VM
    {
        public Stad Stad { get; set; }
        [Required(AllowEmptyStrings=false, ErrorMessage="You need to enter a comment of valid length")]
        [MinLength(5, ErrorMessage ="You need to enter a comment of valid length")]
        public Commentaar Commentaar { get; set; }
    }

一个好的做法是在post方法上使用
ModelState.IsValid
,以便检查正在发送的模型的属性。也就是说,ModelState.IsValid检查您在模型上编写的数据注释

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind("CommentaarText, Tijdstip")] int id, IFormCollection collection) //Bind = protect from overposting
    {
         if(ModelState.IsValid)
         {
             //If it is valid, do all your business logic, like creating a new entry.
         }
         else
         {
             //Handle it
             return View();
         }
    }
另一件事是,我看到您使用了
ViewModels
,这很好。因此,您可以将viewmodel作为操作的参数发送。你可以这样做:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(CommentaarCreate_VM viewmodel)
    {
          if(ModelState.IsValid)
          {
               //It is valid
               //All your logic
          }
          else
          {
               //Not valid
               return View(Viewmodel model)
          }         
    }
通过这样做,您必须向
CommentaarCreate\u VM

  public class CommentaarCreate_VM
    {
        public Stad Stad { get; set; }
        [Required(AllowEmptyStrings=false, ErrorMessage="You need to enter a comment of valid length")]
        [MinLength(5, ErrorMessage ="You need to enter a comment of valid length")]
        public Commentaar Commentaar { get; set; }
    }

因此,我至少找到了某种解决方案,但根本问题仍然存在。 问题是,在控制器中,Modelstate.IsValid始终为true,即使某些模型不应该是有效的,所以它只是在重定向到另一个页面之前执行我希望它执行的操作。 解决方案是,如果在控制器中检查字符串是否为null或空,并且如果为空,则返回(viewmodel),这样就可以使错误消息正常工作。 显然,Modelstate.IsValid不应该返回true,我仍然不知道它为什么返回true

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind("CommentaarText, Tijdstip")] int id, CommentaarCreate_VM viewModel, IFormCollection collection) //Bind = protect from overposting
    {
        try
        {
          //If incoming string is null or empty
            if (string.IsNullOrEmpty(collection["Commentaar"]))
            {
                return View(viewModel);
            }
//This always returns true. It really shouldn't, because otherwise I wouldn't need that earlier check. 
//If the model isn't valid in the View, this one should be false, right?
            if (ModelState.IsValid)
            {
                // Creating  object to POST
                //.....

                return RedirectToAction(nameof(Index));
            }

            return View();
        }
        catch
        {
            return View();
        }
    }

因此,我至少找到了某种解决方案,但根本问题仍然存在。 问题是,在控制器中,Modelstate.IsValid始终为true,即使某些模型不应该是有效的,所以它只是在重定向到另一个页面之前执行我希望它执行的操作。 解决方案是,如果在控制器中检查字符串是否为null或空,并且如果为空,则返回(viewmodel),这样就可以使错误消息正常工作。 显然,Modelstate.IsValid不应该返回true,我仍然不知道它为什么返回true

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind("CommentaarText, Tijdstip")] int id, CommentaarCreate_VM viewModel, IFormCollection collection) //Bind = protect from overposting
    {
        try
        {
          //If incoming string is null or empty
            if (string.IsNullOrEmpty(collection["Commentaar"]))
            {
                return View(viewModel);
            }
//This always returns true. It really shouldn't, because otherwise I wouldn't need that earlier check. 
//If the model isn't valid in the View, this one should be false, right?
            if (ModelState.IsValid)
            {
                // Creating  object to POST
                //.....

                return RedirectToAction(nameof(Index));
            }

            return View();
        }
        catch
        {
            return View();
        }
    }


检查appsetting下的web.config中是否将ClientValidationEnabled和UnobtrusiveJavaScriptEnabled设置为true。您说的是客户端验证还是服务器端验证?在服务器端,您永远不会检查ModelState.IsValid。您如何知道您的模型状态是否有效?@Fran Clientside validation.@SuprabhatBiswal web.config显然不再存在于此版本的ASP中,我尝试通过startup.cs服务手动启用它,但这并没有改变什么,所以我猜默认情况下它是打开的。检查appsetting下web.config中的ClientValidationEnabled和UnobtrusiveJavaScriptEnabled是否设置为true。您是说客户端验证还是服务器端验证?在服务器端,您永远不会检查ModelState.IsValid。您如何知道您的模型状态是否有效?@Fran Clientside validation.@SuprabhatBiswal web.config显然不再存在于此版本的ASP中,我曾尝试通过startup.cs服务手动启用它,但没有改变任何内容,因此我猜默认情况下它处于启用状态。尝试了此操作,但无效。我创建了一个新的testing Create视图,默认情况下对所有属性执行所有这些操作,但即使所有属性都将[required]作为dataAnnotation,它仍然不会给出错误。@Sven0567您可以在post操作中从客户端获取输入值吗?@Sven0567我可以问一下为什么使用bind,不只是返回CommentaarCreate_VM object?是的,我可以从post操作中获取输入值,我可以手动完成所有操作,但我只是很困惑,如果应该的话,为什么它不能自动完成。另外,我用bind来表示,只有这两个道具应该被改变,以防止套印。我尝试了这个,但没有成功。我创建了一个新的testing Create视图,默认情况下对所有属性执行所有这些操作,但即使所有属性都将[required]作为dataAnnotation,它仍然不会给出错误。@Sven0567您可以在post操作中从客户端获取输入值吗?@Sven0567我可以问一下为什么使用bind,不只是返回CommentaarCreate_VM object?是的,我可以从post操作中获取输入值,我可以手动完成所有操作,但我只是很困惑,如果应该的话,为什么它不能自动完成。另外,我使用bind来表示,只有这两个道具才应该更改,以防止套印。多亏了提示,我尝试将注释添加到viewmodel中,但这也不起作用,ModelState.IsValid始终返回true,即使视图中的输入值为空且属性具有[Required]标签。也许这听起来很棘手,但是,您是否尝试过清理解决方案并重新构建它?事实上,我经历了很多次,在我清理整个解决方案并重新构建它之前,我的模型上的更改(如对其属性的新数据批注)没有被考虑在内。清理并重新构建后,我忘记了之前做的操作,但它仍然没有改变任何东西。感谢提示,我尝试将批注添加到viewmodel中,但这也不起作用,ModelState.IsValid始终返回true,即使视图中的输入值为空,并且属性具有[Required]标记。这听起来可能很棘手,但是,您是否尝试过清理解决方案并重新构建它?事实上,我经常遇到这样的情况,我的模型上的更改,比如对其属性的新数据注释,直到我清理了整个解决方案并重新构建