Making a validator work from the back end code - c#

I added a regex validator but its not showing anything on the page, basically the validation is done somewhere else i just needed to fire up. Here is the validator
<div>
<asp:RequiredFieldValidator
ID="RegularNoCardAccepted" runat="server"
ControlToValidate="txtCreditCardNumber"
CssClass="Error" Display="Dynamic">
</asp:RequiredFieldValidator>
</div>
And here is how I am trying to fire up, in reality i dont need it to check against a regular expression, I am just not sure how to make it pop up when it meets this condition
if (CardNotAccepted())
{
//Find the validator located somewhere in the master page.
RequiredFieldValidator reqVal =
FindControlRecursive(this.Page.Master, "RegularNoCardAccepted")
as RequiredFieldValidator;
if (reqVal != null)
{
//The code goes through here but it never shows.
reqVal.Enabled = true;
reqVal.Text = "Credit Card Type is not accepted";
reqVal.Visible = true;
reqVal.Validate();
}
return;
}

ASP.NET FieldValidators work automatically (assuming the Enabled property is set to true) on POST events. Here is an example of use: http://www.w3schools.com/aspnet/showasp.asp?filename=demo_reqfieldvalidator

Related

Defining Label.Text leads to a NullReferenceException

I am trying to set a label to show some text when an error occurs. When I make this error occur, the label throws a NullReferenceException.
Here is the label.Text code from the code behind:
if (userEmail != null)
{
//If the same email exists
pnlError.Visible = Visible;
lblError.Text = "Error: The email you have entered is already assigned to an account.";
}
When I build, I get no errors, which would suggest to me that it is able to find it in the ASPX code.
Here it is in the markup:
<asp:Panel ID="pnlError" runat="server" Visible="false" EnableViewState="false">
<label id="lblError"></label>
</asp:Panel>
As you can see it is wrapped in a panel. I can change the visibility of the panel just fine in the same function as the Label.Text
And here it is defined in the aspx.designer.cs:
protected global::System.Web.UI.WebControls.Panel pnlError;
protected global::System.Web.UI.WebControls.Label lblError;
It is worth mentioning, that whenever I change any other WebControl elements in the markup, such as a button or panel, the aspx.design.cs regenerates, but it fails to include the lblError label. I have tried deleting and then regenerating the design manually to no avail.
Since the label is inside of a panel you need to find it:
if (userEmail != null)
{
//If the same email exists
pnlError.Visible = Visible;
var lblError= ((Label)(pnlError.FindControl("lblError")));
if(lblError != null)
{
lblError.Text = "Error: The email you have entered......";
}
}
Edit:
You better use asp control
<asp:Label ID="lblError" runat="server" ></asp:Label>
then you dont need to find it
pnlError.Visible = Visible;
lblError.Text = "Error: The email you have entered......";

ASP.NET server side validation not firing

In My Application server side validation function is not working.even function is not called. i have put debugger on thuat function but it is not stopped ny debugger .i.e. function is not called
<asp:TextBox type="text" ID="txtMobilePhone" runat="server" ClientIDMode="Static" CausesValidation="true"/>
<asp:CustomValidator ID="cvMobilePhone" runat="server" OnServerValidate="cvMobilePhone_ServerValidate"
Text="Mobile Phone already exist in this Reward Program." ErrorMessage="Mobile Phone already exist in this Reward Program."
Display="Dynamic" ValidationGroup="vgStep2" ControlToValidate="txtMobilePhone" CssClass="error"></asp:CustomValidator>
<asp:RequiredFieldValidator ID="rfvMobilePhone" runat="server" ControlToValidate="txtMobilePhone"
ErrorMessage="Mobile Phone is required." CssClass="error" ValidationGroup="vgStep2"></asp:RequiredFieldValidator>
<asp:CustomValidator ID="cvMobilePerVal" runat="server" ClientValidationFunction="validateEmailOrMobilePerVal"
Display="Dynamic" ValidationGroup="vgStep2"></asp:CustomValidator>
<asp:Button ID="btnStep2Upper" runat="server" ClientIDMode="Static" OnClick="btnSaveContactClick" Text="Save" ValidationGroup="vgStep2" vg="vgStep2" OnClientClick="return ClientValidate();" />
Server Side Code
protected void cvMobilePhone_ServerValidate(object source, ServerValidateEventArgs value)
{ /* I have put debugger here but control is not coming here*/
/* my validation logic*/
protected void cvMobilePhone_ServerValidate(object source, ServerValidateEventArgs value)
{
if (txtMobilePhone.Text.Trim() != "")
{
RewardProgramDataContext db = new RewardProgramDataContext();
Boolean f = false;
string MobilePhone = cmnFunc.RemoveMobilePhoneFormat(txtMobilePhone.Text.Trim());
if (Request["id"] != null)
{
var cData = db.spContactSelectAllSingle(new Guid(Request["id"])).SingleOrDefault();
if (cData != null)
{
if (cmnFunc.RemoveMobilePhoneFormat(cData.MobilePhone) == MobilePhone)
{
f = true;
value.IsValid = true;
}
}
}
if (f == false)
{
var res = db.spContactDuplicateMobile(new Guid(ddlContactList.SelectedValue), MobilePhone).SingleOrDefault();
if (res.Column1 <= 0)
{
value.IsValid = true;
customIsValid = true;
}
else
{
value.IsValid = false;
customIsValid = false;
}
}
}
}
now when i click submit button all clent side validation working but serside custom validator is not calling
You forget to set the ControlToValidate property?
<asp:CustomValidator ID="cvMobilePhone" runat="server" ControlToValidate="txtMobilePhone" OnServerValidate="cvMobilePhone_ServerValidate"
Text="Mobile Phone already exist in this Reward Program." ErrorMessage="Mobile Phone already exist in this Reward Program."
Display="Dynamic" ValidationGroup="vgStep2" CssClass="error"></asp:CustomValidator>
You have a combination of two different things causing this behaviour.
Firstly, note that although—as has been said by others—you do not have to specify ControlToValidate, doing so restricts the circumstances in which the server-side custom validation event will fire. Specifically, if you leave it unset, the event always fires on postback, whereas if you set it, the event only fires when the control identified by ControlToValidate has a non-empty value.
Secondly, by specifying OnClientClick, you are telling the framework that you will take care of client-side validation, which will now not fire unless you call it from your OnClientClick function. Although you have not included your ClientValidate function in your question, I suspect you are not doing so, which leaves your RequiredFieldValidator powerless to prevent the postback.
In combination, these two things mean that
the postback occurs despite the empty textbox, and
the server-side custom validation does not fire on postback, because of the empty textbox.
You can call the client validation from your custom function using Page_ClientValidate()), which will be present in your page script since the page contains validators.
function ClientValidate() {
if (Page_ClientValidate()) {
//do custom validation, maybe return false
return true;
}
else {
return false;
}
}

asp.net jscript Error: Unable to get property 'value' of undefined or null reference

Just start learning and having this problem while practicing with jscript
Code:
<script type="text/jscript" language="jscript">
function MyClientFunction(sender, arguments) {
var intValue = arguments.value;
alert(arguments.value);
if (intValue % 2 == 0) {
arguments.IsValue = true;
}
else {
alert("Use Even Numbers");
}
}
</script>
<asp:textbox ID="TextBox1" runat="server"></asp:textbox>
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="CustomValidator" ClientValidationFunction="MyClientFunction();" EnableClientScript="true"></asp:CustomValidator>
<asp:Button ID="Button1" runat="server" Text="Button"></asp:Button>
showing error after clicking the "button":
"...Error: Unable to get property 'value' of undefined or null reference..."
I'm not sure how the parameters are passed, not really familiar with how the jscript function works
tried this and no errors:
var intValue = document.getElementById("TextBox1").value;
alert(intValue);
Thanks a lot..
Don't pass this. You don't want to pass anything, you just want to give it the name of your function and the rest will be handled for you:
ClientValidationFunction="MyClientFunction"
Refer to the example on this page.
Also make sure you're using the correct capitalization. It should be arguments.Value and arguments.IsValid.
you have a few issues. here's a fixed version
<script>
function MyClientFunction(sender, args) {
var intValue = args.Value;
alert(args.Value);
if (intValue % 2 == 0) {
args.IsValid = true;
}
else {
args.IsValid = false;
}
}
</script>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CustomValidator ID="CustomValidator1" runat="server"
ControlToValidate="TextBox1" ErrorMessage="Use Even Numbers"
ClientValidationFunction="MyClientFunction" EnableClientScript="true"></asp:CustomValidator>
<asp:Button ID="Button1" runat="server" Text="Button"></asp:Button>
list of things changed
add ControlToValidate property on the validator, set the value to
the ID of the control you want it to validate - TextBox1 in this
case
the value for ClientValidationFunction should be only the name of a
javascript function, not an actual call to it
the function takes two arguments which you have right. I couldn't
find the definition for the parameter properties. the second
parameter has Value (with a capital V) which is the textbox input
now that you have associated the controls correctly.
set IsValid true or false within the method
move the error messages to the validator attribute rather than using
an alert
additionally I changed arguments to args since the former is a default name in javascript.
You aren't passing any parameters when calling your client function.
Therefore, both of its declared parameters are undefined.
You probably want to pass this as a parameter when you call it in the inline event handler.
The reason is because JavaScript is a Case Sensitive language.
The following code should work:
<script type="text/jscript" language="jscript">
function MyClientFunction(sender, arguments) {
var intValue = arguments.Value;
alert(arguments.Value);
if (intValue % 2 == 0) {
arguments.IsValue = true;
}
else {
alert("Use Even Numbers");
}
}
</script>
The explanation is that arguments is a parameter object that has two properties as you know (Value and IsValid) and you are referencing is property "Value" with lowercase "v".
Also you need to add the property ControlToValidate to your CustomValidator:
ControlToValidate="TextBox1"
the public ClientValidationFunction property of the CustomValidator just expect a valid full name reference to your function in your case you can use just "MyClientFunction" without the function call "();". Also all ASP.net validators have a public property called ValidationGroup that is just a label very handy if you have multiple validation regions.

set focus on custom validator

I have 2 textbox, one for login another for password.
I have 1 custom server side validator too, if password is entered wrong, validator is fired.
What I want is to set focus on this error message.
I have tried focus(), and setfocusonerror property too. but its not working.
here is my code:
<asp:CustomValidator ID="cvLogin"
runat="server"
Display="Dynamic"
CssClass="login-req"
OnServerValidate="cvLogin_ServerValidate"
ValidationGroup="tovalidate"
SetFocusOnError="True">
</asp:CustomValidator>
protected void cvLogin_ServerValidate(object source,
ServerValidateEventArgs args)
{
if (currentUser == null)
{
args.IsValid = false;
MessageBox1.Focus();
MessageBox1.SetMessage(Resources.RSResource.Login_InvalidLogin,
Constants.MessageType.Error);
}
Try SetFocus method of Page:
if (currentUser == null)
{
args.IsValid = false;
Page.SetFocus(MessageBox1);
...
}
I am not sure. But may be you need to place your control on a Panel.
UPDATE 2:
I checked SetFocus method. It works for TextBoxes, but doesn't work for Labels or Validators. So if you want to set focus on message the best choise is using javascript:
document.getElementById('MessageBox1').scrollIntoView(true);
I also tested this server side code. It works fine:
Page.ClientScript.RegisterStartupScript(this.GetType(), "FocusScript", "document.getElementById('MessageBox1').scrollIntoView(true);", true);

ASP, Listview conditional Alert

I'm currently working with a listview in which I want an htmltablecell to possess the onclick property which is driven by the codebehind rather than a javascript.. However I'm guessing that's pretty much a dream getting it to obey the C# code... Anyways this is what I want it to run:
protected void show_anm(object sender, EventArgs e)
{
Label hiddenc = (Label)listview1.FindControl("hidden");
Alert.Show(hiddenc.Text);
}
and here's the Alert class
public static class Alert
{
public static void Show(string message)
{
string cleanMessage = message.Replace("'", "\\'");
string script = "<script type=\"text/javascript\">alert('" + cleanMessage + "');</script>";
Page page = HttpContext.Current.CurrentHandler as Page;
if (page != null && !page.ClientScript.IsClientScriptBlockRegistered("alert"))
{
page.ClientScript.RegisterClientScriptBlock(typeof(Alert), "alert", script);
}
}
}
The point is creating a listview with a two conditional tablecells, one which appears only when a certain condition is met and the other appears every other time (that's alredy sorted out). Where the one demanding a condition is Clickable, and upon clicking it it'll display an Alertbox with Data from a specific DB cell...
Sorry if my language and the question seemes off, English isn't my native language and I haven't doused myself in Coffe yet.
Any help on the matter would be most appritiated
EDIT1*
<asp:Listview ................
<ItemTemplate>
<tr ......>
<td id=default .....>
<asp:label ........ Text='<%# eval("stuff") %> />
</td>
<td id=conditional onclick=alert()..........>
<asp:label ......... Text='<%# eval("stuff") %> />
</td>
<td id=hidden visible=false ...........>
<asp:label ......... Text='<%#eval("stuff i want in alert") %>' />
.....
<script tyupe="text/javascript">
function alert()
{
var msg = document.getElementById("tried with label id and tablecell id nothing seemingly worked").value;
alert(msg);
}
</script>
I recently made a workaround that shows the data I want to display in the labels tooltip but I'd still prefer the alertbox to work properly as it feels more natural to click something.
Edit2 In case anyone is wondering I used the ItemDataBound event to bind the visibility of cells default and conditional within an if clause to make sure the control exists and the conditions are met.
I am confused as to why you're doing what you're doing. Why do you want the codebehind to handle an onclick event of a htmltablecell when you are pumping out javascript to show an alert anyway?
Why not just handle the whole logic within Javascript?
A postback from a htmltablcell will also require javascript
Set your tablecell to call a javascript function which would obtain the alert text from the hidden value and display that;
function ShowAlert()
{
var message = document.getElementbyId("hidden").value;
alert.show(message);
}

Categories