You need to sign in to do that
Don't have an account?
TehNrd
How to handle the error when inputText is set to incorrect data type?
In the process of building out a Visualforce page I have run into an error I am not sure how to handle. I have an inputText field that maps to an Integer variable in the controller. It works great if the user enters in a Integer. Yet if they enter letters or decimal the logic fails in the controller and the debug log shows the following ...
j_id0:j_id1:j_id2: An error occurred when processing your submitted information.
...and the page appears to do nothing, no displayed errors or anything:
It would be great if the VF page automatically displayed an error message similar to what is does for inputFields. Something like "Invalid Integer" or what ever data type it is supposed to be. I've attached code below that compares the behaviors.
What should I do to handle this? Its looking like I will have to use a string variable and then convert that to an integer but then I will need to catch any errors if the conversion fails which intern requires more unit tests. More work than I'd like to do if possible.
Ideas, thoughts?
Message Edited by TehNrd on 05-01-2008 10:42 AM
j_id0:j_id1:j_id2: An error occurred when processing your submitted information.
...and the page appears to do nothing, no displayed errors or anything:
It would be great if the VF page automatically displayed an error message similar to what is does for inputFields. Something like "Invalid Integer" or what ever data type it is supposed to be. I've attached code below that compares the behaviors.
What should I do to handle this? Its looking like I will have to use a string variable and then convert that to an integer but then I will need to catch any errors if the conversion fails which intern requires more unit tests. More work than I'd like to do if possible.
Ideas, thoughts?
Code:
//When you enter an invalid probability it lets you know. If you enter an invalid integer it gives no warning. <apex:page controller="input"> <apex:outputPanel id="panel"> <apex:form> <apex:inputText value="{!numberEntry}" /><br/> <apex:inputField value="{!opp.Probability}" /><br/> <apex:commandButton action="{!submit}" value="Submit" rerender="panel"/> </apex:form> </apex:outputPanel> </apex:page> public class input { Integer numberEntry; public Integer getNumberEntry() { return numberEntry; } public void setNumberEntry(Integer numberEntry){ this.numberEntry = numberEntry; } Opportunity opp = new Opportunity(); public Opportunity getopp() { return opp; } public PageReference submit() { system.debug(numberEntry); system.debug(opp.probability); return null; } }
Message Edited by TehNrd on 05-01-2008 10:42 AM
all you need in your controller is an empty sobject that just holds a number field.
something like this
if you don't have such a field, you could create one for this reason, or just use another sobject that has a number as a temporary number holder.
sort of like this:
then in the controller :
Account tmp = new Account();
getAccount() {return tmp; }
then when you need the number, just get it out of tmp.NumberOfEmployees
never insert the temporary account and no harm done, in this case Account tmp is just a holder for the number you want the user to enter.
What you get is all the features of inputField without adding a number to your opportunity object.
Once again, thanks for the help Ron. I owe you a beer or something.
The thing about inputText is that it's designed to be a very simple input box with no validation attached. We give you all of the validation rules with inputField (which is why Ron's suggestion is perfect for your case) and give you all of the salesforce styling (error messaging included), but we need to have inputText to be a vanilla solution for developers who don't want salesforce behavior. Sure, we could take every inputText component you have and do some validations on it (requiredness, etc.) and then if there's an error, surround it with a big, bold, red box, but what about the developers who have their own UI design for error messaging? inputText is the only component they can use then, and that's why we keep this validation limited to inputField. You can supply your own validation if you'd like (more work than using the inputField proxy, though), which would give you complete controll over the placement of your error messaging.
I bet if you had had the "messages" component on your page you would have seen some sort of error. It's good to have that on your page while you're developing, and especially good to add when your page looks like it's refreshing and not doing what you ask it to.
When you aren't using the messages component, it's difficult for us to know what to do (and as a team we've had several discussions about this). It's not very appropriate for us to just inject the error messaging we think you want directly on your page somewhere.
How do validation rules work with inputField? Are you talking about Summer 08?
I use inputField wherever possible and still have to do all my validation manually.
Using fields on SObjects allows all field validation to be done in real time without lots of extra code. I will post some code that shows what I did.
What is cool about the code above is that as soon as the user navigates away from the inputField the panel will refresh and display any errors. Example, user enters text, the "Error: Invalid number" message will appear and if they enter 7273, "Error: Number is too large" both shown with standard red highlighting. The only validation I have left to do in this example is make sure the input is greater than 0 and less than or equal to 100 and this can easily be done in the controller.
FYI, this is example is from a converted s-control that relied on javascript alert() to display most input errors which I despise for a few reasons. 1, its a popup and 2, it add unnecessary clicks.
Jill, thanks for the detail behind the thought process for this behavior. The more familiar I become with VF the more sense it makes.
Message Edited by TehNrd on 05-04-2008 08:54 PM
<style>
.split {width: 15px}
</style>
<apex:inputField value="{!sourceOppPercent.Split_Percent__c}" style="split"/>
EDIT:
This worked: <apex:inputField value="{!sourceOppPercent.Split_Percent__c}" style="width: 25px"> but I would still like to define this style in one place and use it for many fields.
Message Edited by TehNrd on 05-05-2008 12:37 PM
Disclaimer: we have some inconsistencies between different types of fields where style and styleClass values actually work (meaning if you view the source they are actually being appended as an attribute to the various input tags that get generated).
We're working on fixing this for all of our various types of fields but unfortunately not all of them work right now.
Jill
Hi, Have you found a solution to your question as to how to make a inputtext accept only numeric values? If you have please do share the same. I am also facing the same issue. For the time being I am using the following code for a solution
boolean check = pattern.matches('[a-zA-Z]+', inputtextvalue);
if(check == true) {
your error message
}
Thanks
KD