Avatar of ashley2009
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






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
------------------------------------------------

Open in new window

Visual Basic.NETASP.NETC#

Avatar of undefined
Last Comment
ashley2009
ASKER CERTIFIED SOLUTION
Avatar of ToddBeaulieu
ToddBeaulieu
Flag of United States of America image

Blurred text
THIS SOLUTION IS ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
Avatar of ashley2009
ashley2009

ASKER

thanks.
ASP.NET
ASP.NET

The successor to Active Server Pages, ASP.NET websites utilize the .NET framework to produce dynamic, data and content-driven web applications and services. ASP.NET code can be written using any .NET supported language. As of 2009, ASP.NET can also apply the Model-View-Controller (MVC) pattern to web applications

128K
Questions
--
Followers
--
Top Experts
Get a personalized solution from industry experts
Ask the experts
Read over 600 more reviews

TRUSTED BY

IBM logoIntel logoMicrosoft logoUbisoft logoSAP logo
Qualcomm logoCitrix Systems logoWorkday logoErnst & Young logo
High performer badgeUsers love us badge
LinkedIn logoFacebook logoX logoInstagram logoTikTok logoYouTube logo