2013-03-12 68 views
1

我有三個字段,用於啓動搜索,其中任何兩個都可以是空的,但我需要檢查以確保用戶填寫了多個字段不全爲空

所以,我有FirstName,LastName和一個ID號碼。用戶應該能夠通過這些字段中的任何一個,兩個或三個進行搜索,但是如果他們單擊提交而不輸入任何內容,我想要將其捕獲。

我對.NET相當陌生,但就我所知,這意味着編寫自定義驗證。驗證屬性本身似乎不夠用。

這就是要走的路嗎?如果是這樣,或者其他方法更好,是否可以提供一些指導?

+0

我編輯完標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-03-12 22:46:50

+0

編輯標題很好,但我不知道我怎麼知道哪些詞是標籤,哪些不是我仍然在輸入標題。但下次我會盡量注意。 – 2013-03-13 16:22:53

+0

只需問問自己,您是否爲了對問題進行分類而在標題中添加單詞。那麼不要使用這些詞。 – 2013-03-13 16:25:36

回答

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> 
} 
+0

這是一個非常詳細的答案,謝謝。在試圖實現它時,我發現控制器認爲沒有辦法進入else條件,並且編譯器不能識別else子句中的「searchModel」。我可以在主要條件下將searchModel返回到View中。這裏就像C#101一樣。我錯過了什麼? – 2013-03-12 22:27:31

+0

你能發佈相關的控制器代碼嗎? – Oliver 2013-03-12 22:32:34

+0

代碼太長,所以我只包含一個字段。 公共的ViewResult FindStudents(Models.Student學生) { \t如果(ModelState.IsValid) \t { \t \t變種目標=新BoiseStateLdapData(LdapServerPath,LdapServerUserName,LdapServerPassword,LdapBaseDn); var search = new SearchParam(BooleanOperator.AND); search.Add(FilterFactory.NewFilter(PrefixFactory.NewPrefix(「employeeid」),Operator.EQ,new Id(student.StudentId +「*」))); var results = target.GetLdapDataList(search,new string [] {「employeeid」,「cn」,「givenname」,「sn」});}};}}} \t \t return查看(results); \t} \t其他 \t { \t \t返回查看(結果); \t} – 2013-03-13 14:14:09

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#多一點,它的實施。

希望有幫助。


更新:

我沒有看到一個字段可以爲空,或空。但是你要求另外兩個領域;您可以簡單地進行字段驗證,但您希望將這些結果連接起來。

你會想要使用&&操作數。就好像兩個變量都是真的一樣;那麼它將執行任務。 ||在哪裏可以讓人錯誤地進行驗證。

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

正如我所說,這是一個基本的方法。有更有效的方法來處理這種驗證,但我會從簡單的開始,因爲你是C#和Microsoft.Net的新手。

+0

謝謝。我確實看到了這裏的邏輯。我首先嚐試了奧利弗的方法,但如果我結束使用你的方法,我會發布並投票。感謝您的及時回覆。 – 2013-03-12 22:28:19

+0

@SkipKnox Olivers方法是一種更先進的方法,它更好。目標是理解概念邏輯。只要我們的職位幫助是重要的。 – Greg 2013-03-12 22:43:39

相關問題