Asp.net MVC 2 проверить пользовательский контроль - PullRequest
0 голосов
/ 20 июля 2010

Я занимаюсь разработкой сайта, который должен иметь небольшую форму, повторяющуюся на многих страницах. Поэтому я решил создать пользовательский элемент управления (частичное представление), имеющий эту форму.

Эта форма отправляет сообщение действию, поэтому у меня есть:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SampleProject.DoSomethingActionVM>" %>
<%= using(Html.BeginForm("DoSomethingAction", "Home")){ %>

    //Form stuff

<% } %>

Итак, действие

public ActionResult DoSomethingAction(DoSomethingActionVM model){
   if(!ModelState.IsValid){
         return View(); //HERE IS THE PROBLEM
   }

   //Do something
}

Итак, проблема возникает, когда я хочу проверить форму. Если форма недействительна, я не знаю, где ее вернуть, так как этот пользовательский элемент управления используется во многих представлениях ... :( Я попытался использовать скрытое поле в пользовательском элементе управления, в котором указано, какой View использовать ... но это была плохая идея, поскольку я использую строго типизированные представления и не знаю, какую модель отправлять.

Каков наилучший способ проверки форм внутри пользовательских элементов управления (частичные представления)?

Спасибо всем заранее. Я буду благодарен вам еще больше, если вы можете дать мне быстрые идеи, так как они мне нужны для завтрашней работы:)

Juan

Ответы [ 4 ]

0 голосов
/ 21 июля 2010

Я нашел решение ... Его нужно использовать ajax для отправки формы внутри элемента управления и иметь функцию javascript, которая обрабатывает ответ.Итак, в действии вы проверяете, если ModelState.IsValid, если он недействителен, вы получаете ошибки состояния модели, помещаете их в объект JSON и возвращаете его.Если все в порядке, мне нужно было перенаправить на другую страницу, поэтому я возвращаю объект JSON с URL-адресом перенаправления.

Это URL того, что дает основы для решения проблемы: http://www.hightech.ir/SeeSharp/aspnet-validation-with-ajax-and-json

спасибо всем за ответы!Juan

0 голосов
/ 20 июля 2010

Вы можете поместить <form> вне пользовательского элемента управления на странице вызова.

0 голосов
/ 20 июля 2010

Ваша идея передать метаданные в действие выглядит красиво.Вы хотите использовать представление, но я бы взял вызывающий URL.

Таким образом, вам не нужно знать представление и модель, но вы можете просто перенаправить на вызывающий URL.Таким образом вы потеряете ваши ModelState.Errors, но вы можете решить эти проблемы, используя TempData напрямую или атрибут ModelStateToTempdata MVCContrib.

0 голосов
/ 20 июля 2010

Почему бы не создать слой службы, который создает проверку вместо вас вместо пользовательского элемента управления? См. Мой блог для получения дополнительной информации.

По сути, в вашем слое 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:

Прочитав ваш "ответ", я думаю, что лучше понимаю ваш вопрос. Вот что я думаю, ваш лучший вариант будет.

  1. Вам необходимо создать пользовательский ViewModal для полей, которые вы хотите отправить в View. В этом ViewModal вы хотите создать проверку, как я делал выше.
  2. Затем вам нужно создать представление для отправки 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...