C# 型号为isn&x27;t验证
因此,当为我的模型输入文本时,它总是有效的,即使我明确要求它有一个minLength,尽管它是空的或小于minLength 型号: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
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]标记。这听起来可能很棘手,但是,您是否尝试过清理解决方案并重新构建它?事实上,我经常遇到这样的情况,我的模型上的更改,比如对其属性的新数据注释,直到我清理了整个解决方案并重新构建