ashley2009
asked on
ASP .NET MVC Conditional Validation RequiredIF Question with VB .NET Code
Hello
I have question on ASP .NET MVC's Property validation with conditional validation.
I need to make a custom validation --- conditional validation, and I have two requirement
-------------------------- ---------- ---------- ---------- ---------- ---------- ---------- ------
1) if field A has value "Other", then field B is required.
2) if filed A has value "Other" or null(nothing) and field B is filled, then field A's error message will not be shown
How to accomplish this. Please note that the attached C# .NET code I got from this url:
http://blogs.msdn.com/b/simonince/archive/2010/06/04/conditional-validation-in-mvc.aspx
I translated this to VB .NET, but I get compile error, which comes from ViewModel where I state
<RequiredIf("firstName", "Anna")> _
Public Property lastName() As String
...
...
....
End Property
Private m_lastName As String
The error shows me that too many arguments to Public Sub New
Why am I getting compiled error?
And how to translate this line of C# code to VB .NET?
yield return new ModelValidationResult { Message = ErrorMessage };
If the above error gets fixed, my next question would be how to modify the code so that second requirement can be achieved, which is
if filed A has value "Other" or null(nothing) and field B is filled, then field A's error message will not be shown
I have question on ASP .NET MVC's Property validation with conditional validation.
I need to make a custom validation --- conditional validation, and I have two requirement
--------------------------
1) if field A has value "Other", then field B is required.
2) if filed A has value "Other" or null(nothing) and field B is filled, then field A's error message will not be shown
How to accomplish this. Please note that the attached C# .NET code I got from this url:
http://blogs.msdn.com/b/simonince/archive/2010/06/04/conditional-validation-in-mvc.aspx
I translated this to VB .NET, but I get compile error, which comes from ViewModel where I state
<RequiredIf("firstName", "Anna")> _
Public Property lastName() As String
...
...
....
End Property
Private m_lastName As String
The error shows me that too many arguments to Public Sub New
Why am I getting compiled error?
And how to translate this line of C# code to VB .NET?
yield return new ModelValidationResult { Message = ErrorMessage };
If the above error gets fixed, my next question would be how to modify the code so that second requirement can be achieved, which is
if filed A has value "Other" or null(nothing) and field B is filled, then field A's error message will not be shown
VB .NET Codes:
------------------
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.ComponentModel.DataAnnotations
Imports site.Helpers
Namespace site.Helpers
Public Class RequiredIfValidator
Inherits DataAnnotationsModelValidator(Of RequiredIfAttribute)
Public Sub New(ByVal metaData As ModelMetadata, ByVal context As ControllerContext, ByVal attribute As RequiredIfAttribute)
MyBase.New(metaData, context, attribute)
End Sub
Public Overrides Function GetClientValidationRules() As IEnumerable(Of ModelClientValidationRule)
Return New ModelClientValidationRule()
End Function
Public Overrides Function Validate(ByVal container As Object) As IEnumerable(Of ModelValidationResult)
Dim field = Metadata.ContainerType.GetProperty(Attribute.DependentProperty)
'= Metadata.ContainerType.GetProperty(Attribute.DependentProperty
If field <> Nothing Then
Dim value As Object = field.GetValue(container, Nothing)
If value <> Nothing And Attribute.TargetValue = Nothing Or (value.Equals(Attribute.TargetValue)) Then
If Not Attribute.IsValid(Metadata.Model) Then
'how to translate the below C# .NET line in VB .NET?
' yield return new ModelValidationResult { Message = ErrorMessage };
End If
End If
End If
Return container
End Function
End Class
End Namespace
VB .NET Codes
-----------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace ConditionalValidation.Validation
{
public class RequiredIfAttribute : ValidationAttribute
{
// Note: we don't inherit from RequiredAttribute as some elements of the MVC
// framework specifically look for it and choose not to add a RequiredValidator
// for non-nullable fields if one is found. This would be invalid if we inherited
// from it as obviously our RequiredIf only applies if a condition is satisfied.
// Therefore we're using a private instance of one just so we can reuse the IsValid
// logic, and don't need to rewrite it.
private RequiredAttribute innerAttribute = new RequiredAttribute();
public string DependentProperty { get; set; }
public object TargetValue { get; set; }
public RequiredIfAttribute(string dependentProperty, object targetValue)
{
this.DependentProperty = dependentProperty;
this.TargetValue = targetValue;
}
public override bool IsValid(object value)
{
return innerAttribute.IsValid(value);
}
}
}
----------------------------------------
ViewModel in VB .NET
<Required(ErrorMessage:="Specify first Name.")> _
Public Property firstName() As String
Get
Return m_firstName
End Get
Set(ByVal value As String)
m_firstName = value
End Set
End Property
Private m_firstName As String
<RequiredIf("firstName", "Anna")> _
Public Property lastName() As String
Get
Return m_lastName
End Get
Set(ByVal value As String)
m_lastName = value
End Set
End Property
Private m_lastName As String
// So if the last name is Anna, first name is required
------------------------------------------------
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER