我有三個字段,用於啓動搜索,其中任何兩個都可以是空的,但我需要檢查以確保用戶填寫了。多個字段不全爲空
所以,我有FirstName,LastName和一個ID號碼。用戶應該能夠通過這些字段中的任何一個,兩個或三個進行搜索,但是如果他們單擊提交而不輸入任何內容,我想要將其捕獲。
我對.NET相當陌生,但就我所知,這意味着編寫自定義驗證。驗證屬性本身似乎不夠用。
這就是要走的路嗎?如果是這樣,或者其他方法更好,是否可以提供一些指導?
我有三個字段,用於啓動搜索,其中任何兩個都可以是空的,但我需要檢查以確保用戶填寫了。多個字段不全爲空
所以,我有FirstName,LastName和一個ID號碼。用戶應該能夠通過這些字段中的任何一個,兩個或三個進行搜索,但是如果他們單擊提交而不輸入任何內容,我想要將其捕獲。
我對.NET相當陌生,但就我所知,這意味着編寫自定義驗證。驗證屬性本身似乎不夠用。
這就是要走的路嗎?如果是這樣,或者其他方法更好,是否可以提供一些指導?
您可以在搜索模型上實現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>
}
這是一個非常詳細的答案,謝謝。在試圖實現它時,我發現控制器認爲沒有辦法進入else條件,並且編譯器不能識別else子句中的「searchModel」。我可以在主要條件下將searchModel返回到View中。這裏就像C#101一樣。我錯過了什麼? – 2013-03-12 22:27:31
你能發佈相關的控制器代碼嗎? – Oliver 2013-03-12 22:32:34
代碼太長,所以我只包含一個字段。 公共的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
你基本上試圖驗證字段是有效的,他們提交之前,這是非常可能的。您可以構建自己的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的新手。
謝謝。我確實看到了這裏的邏輯。我首先嚐試了奧利弗的方法,但如果我結束使用你的方法,我會發布並投票。感謝您的及時回覆。 – 2013-03-12 22:28:19
@SkipKnox Olivers方法是一種更先進的方法,它更好。目標是理解概念邏輯。只要我們的職位幫助是重要的。 – Greg 2013-03-12 22:43:39
另一種選擇是使用Fluent Validation
我編輯完標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-03-12 22:46:50
編輯標題很好,但我不知道我怎麼知道哪些詞是標籤,哪些不是我仍然在輸入標題。但下次我會盡量注意。 – 2013-03-13 16:22:53
只需問問自己,您是否爲了對問題進行分類而在標題中添加單詞。那麼不要使用這些詞。 – 2013-03-13 16:25:36