多个字段都不是空的

时间:2013-03-12 21:44:30

标签: c# .net asp.net-mvc-3 validation

我有三个字段,用于启动搜索,其中任何两个字段都可以为空,但我需要检查以确保用户已填写某些内容

所以,我有FirstName,LastName和一个ID号。用户应该可以搜索这些字段中的任何一个,两个或三个,但是如果他们点击提交而不输入任何内容,我想要捕获它。

我对.NET很新,但尽管我可以说这意味着编写自定义验证。验证属性本身似乎不够。

这是要走的路吗?如果是,或者某种其他方法更好,有人可以提供一些指导吗?

3 个答案:

答案 0 :(得分:2)

您可以在搜索模型上实现IValidatableObject接口。

示例:

public class SearchModel: IValidatableObject
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (string.IsNullOrWhitespace(Field1) && string.IsNullOrWhitespace(Field2) && string.IsNullOrWhitespace(Field3))
            yield return new ValidationResult(("At least one field required.", new[] { "Field1", "Field2", "Field3" })

    }
}

然后在你的控制器中:

[HttpPost]
public ActionResult Search(SearchModel searchModel)
{
   if (ModelState.IsValid)
   {
      //Search
   }
   else
   {
       return View(searchModel);
   }
}

然后在你看来:

@model SearchModel

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>

        <div class="editor-label">
            @Html.LabelFor(model => model.Field1)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Field1)
            @Html.ValidationMessageFor(model => model.Field1)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Field2)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Field2)
            @Html.ValidationMessageFor(model => model.Field2)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Field3)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Field3)
            @Html.ValidationMessageFor(model => model.Field3)
        </div>

        <p>
            <input type="submit" value="Search" />
        </p>
    </fieldset>
}

答案 1 :(得分:0)

在提交之前,您基本上尝试验证字段是有效的,这是非常有可能的。您可以构建自己的Event Handler来处理对这些组件的更改,您可以在按钮上处理Notifier

有很多方法可以实现这样的壮举。使您熟悉概念概念的一种非常简单和基本的方法是错误提供程序

可以在工具箱中找到此组件,您只需将其拖到表单中即可。完成后,您可以执行以下操作textbox

if(textbox1.text == String.EmptyOrNull)
{
    errorProvider1.SetError(textbox1, "Please enter valid field.");
}
else
{
    errorProvider1.Dispose();
    MessageBox.Show(textbox1.text);
}

显然,这是一种基本方法,需要重构,但这应该可以完成您的任务并让自己更熟悉C#及其实现。

希望这有帮助。


<强>更新

我没有看到一个字段可以为null或为空。但是你需要另外两个领域;您可以像往常一样进行字段验证,但是您希望将这些结果连接起来。

您可能希望使用&&操作数。好像两个变量都是真的;然后它将执行任务。 ||在哪里允许虚假验证。

if(textbox1.text == String.EmptyOrNull) && 
        (textbox2.text == String.EmptyOrNull) && 
        (textbox3.text == String.EmptyOrNull))
{
    // One field is Null or Empty, do something.
}

正如我所说,这是一种基本方式。有更有效的方法来处理这样的验证,但我开始很简单,因为你是C#和Microsoft .Net的新手。

答案 2 :(得分:0)

另一种选择是使用Fluent Validation