サーバー側のコードで検証を処理する適切な方法またはエレガントな方法を見つけるのに苦労しています。現在、私はasp.net Webサイトを使用していますが、MVCにも同様に適用できるパターンが欲しいです。
問題を説明するためだけにサンプル/疑似コードを投稿しています。実際のコードは大きく異なり、非常に複雑です。
マークアップ コードは次のようになります。
<asp:CheckBoxList ID="CheckBoxList1" runat="server">
<asp:ListItem>Item1</asp:ListItem>
<asp:ListItem>Item2</asp:ListItem>
<asp:ListItem>Item3</asp:ListItem>
</asp:CheckBoxList>
<asp:CheckBoxList ID="CheckBoxList2" runat="server">
<asp:ListItem>Item4</asp:ListItem>
<asp:ListItem>Item5</asp:ListItem>
<asp:ListItem>Item6</asp:ListItem>
</asp:CheckBoxList>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit" />
コードビハインドは次のようになります。
protected void Button1_Click(object sender, EventArgs e)
{
if (ValidatePage()) {
//call business layer and do some operation.
}
}
bool ValidatePage()
{
int visibility = GetVisibility();
switch (visibility)
{
case 0: //TextBox1.Text can not be empty
//in case it is found to be empty then return false and print the message in web page
case 1: //TextBox1.Text can not be empty
//in case it is found to be empty then return false and print the message in web page
case 2: // both of textbox1 and textbox2 should not be empty
//in case they are found to be empty then return false and print the message in web page
}
//return true or false as per the above validations
}
int GetVisibility()
{
//if page is redirected from page1 then return 1
//if page is redirected from page2 then return 2
//if page is directly open from homepage then return 0
return 0;
}
問題は、より多くのチェック ボックスがチェックされる (つまり、より多くのコンテキストが参照される) ほど、検証が複雑になることです。
ページのどのボタンがそれを呼び出していても、すべての検証を提供する神の方法として作成することを考えています(このアプローチに関する提案/批判を受け入れます)。
- ページはゼロから作成され、新しい機能/コントロール/検証が頻繁に追加されます。
ノート:
私は Requiredfield バリデーターを認識しており、いくつかの複雑さのためにここでは避けています。