基本上我想弄清楚的是如何要求在视图中填写两个字段中的至少一个。要求一个或另一个字段
在我的视图中,我有两个名为ISBN和ISBN13的文本字段。只要其中一个被填充,用户填充哪一个并不重要。
我不确定这里要做什么期望看看写入自定义验证程序,所以我想我会先问。我会包含一些代码,但因为它只是两个简单的字段,我认为这个解释会更好。
基本上我想弄清楚的是如何要求在视图中填写两个字段中的至少一个。要求一个或另一个字段
在我的视图中,我有两个名为ISBN和ISBN13的文本字段。只要其中一个被填充,用户填充哪一个并不重要。
我不确定这里要做什么期望看看写入自定义验证程序,所以我想我会先问。我会包含一些代码,但因为它只是两个简单的字段,我认为这个解释会更好。
我想象一下,在保存到数据库的更改之前,在创建部分添加类似这样的内容到您的控制器。
int countISBN = Product.ISBN.Count() + Product.ISBN13.Count();
if (countISBN <= 9)
{
// Add in an error message.
return View();
}
这将做的是统计两个字段中的字符,将它们相加。如果他们的总和低于10,它会抛出一个错误。
使用MVC Foolproof NuGet包,然后你可以使用RequiredIf
属性象下面这样:
[RequiredIf("ISBN==\"\"")] // backslash is used for escaping the quotes
public string ISBN13 { get; set; }
[RequiredIf("ISBN13==\"\"")]
public string ISBN { get; set; }
你可以在你的控制器动作做了人工确认。 AddModelError
方法将帮助您使用验证堆栈。
[HttpPost]
public ActionResult Edit(EditModel model)
{
if (string.IsNullOrEmpty(model.ISBN) && string.IsNullOrEmpty(model.ISBN13))
{
var validationMessage = "Please provide ISBN or ISBN13.";
this.ModelState.AddModelError("ISBN", validationMessage);
this.ModelState.AddModelError("ISBN13", validationMessage);
}
if (!string.IsNullOrEmpty(model.ISBN) && !string.IsNullOrEmpty(model.ISBN13))
{
var validationMessage = "Please provide either the ISBN or the ISBN13.";
this.ModelState.AddModelError("ISBN", validationMessage);
this.ModelState.AddModelError("ISBN13", validationMessage);
}
if (this.ModelState.IsValid)
{
// do something with the model
}
return this.View(model);
}
有些人可能会说,对查询进行验证不是控制器的责任。我认为控制者的责任是将网络请求调整为域请求。因此,控制器可以有验证逻辑。如果您没有域/业务层,则这种考虑是没有意义的。
你可以对发布在这个问题上的答案做一个小的改变,以获得你想要的东西http://stackoverflow.com/questions/11959431/how-to-create-a-custom-validation-attribute?rq=1 – Shyju
自定义代码在这里绝对适合。事实上,你甚至不需要自定义验证器;这是核心领域的业务逻辑,而不仅仅是UI关注。在无效状态下创建实体应该是不可能的(例如,您可以在构造中添加投掷代码以验证此功能)。在UI中单独的javascript验证有助于为用户提供即时反馈 –