Почему бы не создать слой службы, который создает проверку вместо вас вместо пользовательского элемента управления? См. Мой блог для получения дополнительной информации.
По сути, в вашем слое Service вы создаете метаданные, которые присоединяются к объекту класса. У меня есть класс LINQ to SQL с именем User, и мой UserMetaData добавляет функциональность проверки в класс.
<MetadataType(GetType(UserMetaData))> _
Partial Public Class User
Public Property UserRegion As String
Public LastSeen As DateTime
End Class
Public Class UserMetaData
<DisplayName("name")> _
<Required(ErrorMessage:="Username is required.")> _
<StringLength(30, ErrorMessage:="Username cannot exceed 30 characters.")> _
<RegularExpression("^\w{3,30}$", ErrorMessage:="Not a valid username.")> _
Public Property UserName As String
<DisplayName("email")> _
<StringLength(50, ErrorMessage:="Email Address cannot exceed 50 characters.")> _
<RegularExpression("^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})$", ErrorMessage:="Not a valid email address.")> _
Public Property Email As String
<DisplayName("website")> _
<StringLength(256, ErrorMessage:="Web Address cannot exceed 256 characters.")> _
<RegularExpression("^http(s?)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$", ErrorMessage:="Not a valid website address.")> _
Public Property WebSite As String
<DisplayName("about")> _
<StringLength(2000, ErrorMessage:="Profile cannot exceed 2000 characters.")> _
Public Property About As String
<DisplayName("region")> _
<Required(ErrorMessage:="Region is required.")> _
Public Property UserRegion As Integer
<DisplayName("birthdate")> _
<DisplayFormat(ApplyFormatInEditMode:=True, ConvertEmptyStringToNull:=True, DataFormatString:="{0:MM/dd/yyyy}")> _
Public Property BirthDate As DateTime
End Class
Тогда ваша проверка будет такой же простой, как передача объекта User
в View и затем использование следующего для проверки
<%
Html.EnableClientValidation()
Using Html.BeginForm("Edit", "Users")
%>
<%-- Lot's more crap in here--%>
<tr>
<td>
<%: Html.LabelFor(Function(model) model.UserName)%></td>
<td class="full-width">
<%: Html.TextBoxFor(Function(model) model.UserName) %>
<%: Html.ValidationMessage("UserName", "*")%>
</td>
</tr>
<%-- Lot's more crap in here--%>
<% End Using%>
<script src="../../Assets/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="../../Assets/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
<script src="../../Assets/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>
EDIT:
Прочитав ваш "ответ", я думаю, что лучше понимаю ваш вопрос. Вот что я думаю, ваш лучший вариант будет.
- Вам необходимо создать пользовательский ViewModal для полей, которые вы хотите отправить в View. В этом ViewModal вы хотите создать проверку, как я делал выше.
- Затем вам нужно создать представление для отправки ViewModel, и вам нужно структурировать свой контроллер следующим образом
В вашем контроллере вы отправляете информацию в View
Function Email() As ActionResult
''# do stuff to populate your viewmodel
Return View(customViewModel)
End Function
<AcceptVerbs(HttpVerbs.Post)> _
Function Email(ByVal customViewModel as MyCustomViewModel)
If ModelState.IsValid Then
''# do your valid stuff
Else
Return View(customViewModel)
End If
End Function