我正在开发一个网站,需要在很多页面中重复一个小表单。所以我决定创建一个具有这种形式的用户控件(部分视图)。
这个表单发布到一个动作,所以我有:
<%@ 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 ...但这是一个坏主意,因为我使用的是强类型视图,我不知道要发送什么模型。
验证用户控件(部分视图)中的表单的最佳方法是什么?
提前谢谢大家。如果你能在明天的工作中为我提供快速的想法,我会更加感谢你。)
涓
答案 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>
在阅读“答案”后,我想我更能理解你的问题。这就是我认为你最好的选择。
在您的控制器中,您将信息发送到视图
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
感谢所有回复! 涓