Custom Validation Controls
Custom validation controls are a nice tool that you can use when the standard validation controls just won’t do the job. Most examples I found out there only addressed the server side validation aspect. Don’t get me wrong, you can do that, just use server side, but ideally you want to do both.
Trust me though, if you only want to do one side, do server side. You will want to always do server side as a minimum just in case the user has javascript disabled or something. Server side only is kind of old school but it gets the job done very reliably.
O.K. On to my example. I have a web form and lets say I have a field that I want to make sure is a Float so I can save it into my database. It is nothing special, just a text box. Also for this, lets pretend I already have a required field validator in place. I always use those for fields I require, although you probably could set it to validate empty text, I just always use required field validators for required fields.
<asp:TextBox ID="txtMyFloat" runat="server" Text="" />
Next we need to create the methods to do our validation. First the easy one, the code behind. We are going to call this method cv_ValidFloat.
protected void cv_ValidFloat(object sender, ServerValidateEventArgs e)
{
bool bValid = false;
try
{
float fCheck = float.Parse(e.Value);
bValid = true;
}
catch (Exception ex)
{
ex = null;
bValid = false;
}
finally
{
e.IsValid = bValid;
}
}
Now that we have that, lets create our client side function in javascript.
function ValidFloat(sender, args) {
var vParse = parseFloat(args.Value);
args.IsValid = !isNaN(vParse);
}
You see we still have our familiar sender and args variables. You can use the args just like you normally do in the code behind, mainly to get the Value and set the IsValid. So lets see what our custom validation control looks like.
<asp:CustomValidator ID="valcMyFloat" runat="server" ControlToValidate="txtMyFloat"
Text="*" ErrorMessage="Your Float entry does not appear valid." SetFocusOnError="true"
Display="Dynamic" ClientValidationFunction="ValidFloat" OnServerValidate="cv_ValidFloat"
ValidateEmptyText="false" EnableClientScript="true">
</asp:CustomValidator>
Encrypt That ViewState!
Something that is probably over looked from time to time unless you are just always that secure is encrypting your ViewState. While SSL may prevent some things you will may want to make it a bit harder for an end user to see the information stored in ViewState.
Luckily this is very simple. You can set it in the @Page directive (<%@ Page Language=”C#” ViewStateEncryptionMode=”Always” %>) or in the web.config file (<pages viewStateEncryptionMode=”Always” />).
Of course, like many things .NET there are many ways to do this depending on your specific situation. For that amount of detail you should read the ViewState Overview.
WCF Over SSL
While this seems like it would be a simple task, there are a few minor things you need to do to get things going. I will not go into all of the various details, there are plenty of walk throughs out there to do that. I am going to focus specifically on the web.config settings. For me this is where my trouble lived.
I created a very simple WCF. It has the interface named IService and the svc named Service. It consisted of several methods to add, subtract, and divide. Like I said, it was very simple. It ran great on non-SSL, but then I went to SSL and the trouble started.
I received this error message:
Service ‘WCFTest.Service’ has zero application (non-infrastructure) endpoints. This might be because no configuration file was found for your application, or because no service element matching the service name could be found in the configuration file, or because no endpoints were defined in the service element.
The fix was to properly setup the binding and behaviors, and most importantly the service name and contract. In my non-SSL version I named the service MyService and the contract pointed at IService. In the end for the SSL one of the things I did was use the namespace and the service name for the service and the interface name for the contract. I will put the web.config file below so you can take a look. I will also include some links that helped me find my way.
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<customErrors mode="Off"></customErrors>
</system.web>
<system.serviceModel>
<services>
<service name="WCFTest.IService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="sslBinding" contract="WCFTest.IService" />
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="sslBinding">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
My post to ASP.NET Forums
Beginner’s Guide to WCF
I Have Access – Team Foundation Service Preview
Yesterday I received an email for the Team Foundation Service Preview! I am so excited to start playing with this product. I have added a couple of friends as team members and asked coworkers if they would like to help test it.
My thinking is to have us test creating projects that use the Northwind sample database. At this time I cannot do much. My personal machine is at home, and to connect you need at least a hotfix as long as you have VS2010 SP1. I will update more as I do more.
So far… Not bad. I would like an easier interface to add new team members, but that could be a lack of familiarity on my part. I am also using Chrome to access it.
For more information on what I am talking about, go read Learning About the Team Foundation Service Preview.
Implementing IDisposable
Here is something I tend to forget from time to time. How to impliment IDisposable for a class. While there are many places to find this, I tend to go to my blog first, because usually I will put something in here for what I need.
When declaring you class you need to have it inherit the IDisposable class.
public class MyClass : IDisposable
After that, somewhere in your class you need to implement the methods.
#region IDisposable Methods
//Implement IDisposable.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
//This is where you will do the cleaning
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
}
//MSDN says you can leave the finalizer out if
//the class does not own unmanaged resources.
~MyClass()
{
// Simply call Dispose(false).
Dispose(false);
}
#endregion// IDisposable Methods
For more information you can see the article on MSDN.
Format A Databound Control In A GridView
This is just a little bit that I keep forgetting for some reason. Lets say I have a gridview, and in it I want to display the date. Just the date, but I do not want to use the SQL method to format the date. You just add the format string to the binding.
Text='<%# Bind("myDate", "{0:MM/dd/yyyy}") %>'
This really would work with any kind of formatting that you needed to do. I just felt that date would make an easier example.
Model-First in the Entity Framework
So I finally had the situation come up to do a model-first approach to Entity Framework (EF). It was shockingly simple. Normally I design my databases first and go from there, this time I did my EF model. Now this was just a simple four entity deal but I thought it would be a great Hello Model-First.
You simply create your entities in the designer, adding properties and adjusting their properties. You know, like indicating someNum is an int32 instead of the default string, if something can be null, default values and so on. You also add your associations. Then you generate database from model. I did this by right clicking the design surface and clicking on Generate Database from Model… This will create a SQL script that you can run against your database. In my case I did create an empty database with a SQL user before hand that I used in my connection information for generating the database.
If you still think it is harder than that, you can read this great article by Microsoft. I wanted to look it up and make sure I did not leave something out and found that article. I still suggest you look over the article. It goes into much more detail than my short text, and they include screen shots.
One thing I did go back and do was change the name of that connection. Visual Studio named it MyPartModelObjectContainer (or something close to that), where MyPart was basically what I named the Model. This was simple to do as well. You rename it int eh connectionString area of your web.config and in the properties of the model.edmx file. You can see its properties by just clicking on the design surface, not an entity or anything, just on the empty space.
Entity Framework 4 Quickstart
Wanting to get started with Entity Framework 4? Microsoft has a nice simple quickstart for it. I am thinking of writing my won series of posts for using Entity Framework 4 for the practical developer.
Odd IIS Error – Entity Too Large
I ran into this error today with users uploading images as part of a webform over https. I did some searching and found a few links that I will list below. Basically all of these suggested increasing the UploadReadAheadSize in ApplicaitonHost.config.
http://forums.iis.net/t/1169257.aspx
http://www.iis.net/ConfigReference/system.webServer/security/requestFiltering/requestLimits
SQL Server Date Formats
I found this information several years ago and saved it to a wiki at work. I thought I would put it out here to share with others and for me to access when away from the office.
I must apologize for not remembering where I found this information.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||