Asp.net mvc 2验证用户控制

时间:2010-07-20 01:08:54

标签: asp.net-mvc asp.net-mvc-2

我正在开发一个网站,需要在很多页面中重复一个小表单。所以我决定创建一个具有这种形式的用户控件(部分视图)。

这个表单发布到一个动作,所以我有:

<%@ 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 ...但这是一个坏主意,因为我使用的是强类型视图,我不知道要发送什么模型。

验证用户控件(部分视图)中的表单的最佳方法是什么?

提前谢谢大家。如果你能在明天的工作中为我提供快速的想法,我会更加感谢你。)

4 个答案:

答案 0 :(得分:0)

为什么不创建一个为您而不是用户控件创建验证的服务层? See my blog了解更多信息。

基本上在您的服务层中,您可以创建附加到类对象的MetaData。我有一个名为User的LINQ to SQL类,我的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> 

编辑:

在阅读“答案”后,我想我更能理解你的问题。这就是我认为你最好的选择。

  1. 您需要为要发送到View的字段创建自定义ViewModal。在这个ViewModal中,你想像我上面那样创建验证。
  2. 然后你需要创建一个视图来发送ViewModel,你需要按如下方式构建你的控制器
  3. 在您的控制器中,您将信息发送到视图

    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
    

答案 1 :(得分:0)

您可以将<form>置于用户控件之外的调用页面中。

答案 2 :(得分:0)

您将一些元数据传递给动作的想法看起来不错。 你想使用视图,但我会接受调用网址。

这样您就不必知道视图和模型,但可以重定向到调用URL。您将以这种方式松开ModelState.Errors,但您可以直接使用TempData或MVCContrib的ModelStateToTempdata属性解决此问题。

答案 3 :(得分:0)

我找到了解决方案...... 它使用ajax在控件中发布表单,并有一个处理响应的javascript函数。因此,在操作中,如果ModelState.IsValid无法访问它,如果它无效,则会获得modelstate错误并将它们放入JSON对象并返回它。 如果一切正常,我需要重定向到另一个页面,所以我返回一个带有重定向URL的JSON对象。

这是解决问题的基础知识的网址:http://www.hightech.ir/SeeSharp/aspnet-validation-with-ajax-and-json

感谢所有回复! 涓