Custom Validation with GridView and EF
This is to document how I do custom validation with a GridView in a website that uses Entity Framework.
Some assumptions:
- I am using .NET4 with Entity Framework 4
- I am using an EntityDataSource object
- My GridView command buttons are templates and have the ID set as a command argument
In this example I will address doing an update from a GridView where we want to make sure a field called someName is unique. The table in question has an identity field that is unique and is called ID. Our model is MyModel and our entity is named MyEntities.
The first thing we need to do is create an OnRowCommand event for our GridView. This event will store the ID of the row we want to update. We will store this in the ViewState. My OnRowCommand event consists of a switch statement which I will put below.
switch (e.CommandName) { case "Edit": ViewState["editID"] = e.CommandArgument.ToString(); break; case "Update": ViewState["editID"] = e.CommandArgument.ToString(); break; case "Cancel": ViewState["editID"] = null; break; default: break; }
The next important step is the OnServerValidate event for our custom validation control. This is where the real work happens. My OnServerValidate event puts the value into a string, and the ID into an int. It then calls another private method to set the e.isValid property to the results of the private method. The private method takes the value and ID as parameters. The check is really just counting the number of occurrences of the value in the table that does not equal the ID. Of course in your situation you may not have a string as a value, but you get the idea.
protected void CV_UpdateUniqueName(object sender, ServerValidateEventArgs e) { string sName = e.Value; int nID = Convert.ToInt32(ViewState["editID"].ToString()); e.IsValid = IsNameUnique(sName, nID); } private bool IsNameUnique(string sName, int nID) { bool isUnique = false; try { using (MyEntities oEntities = new MyEntities()) { int nMatches = (from a in oEntities.tblMyTable where a.someName == sName && a.id != nID select a).Count(); isUnique = (nMatches <= 0); } } catch (Exception e) { //Error handling here } return isUnique; }
There you have it, pretty simple.
An Update 6/2/2011
Thinking about it now, perhaps using control state would be better than view state, at least if you tend to turn off view state.
Posted on May 19, 2011, in C#, Entity Framework, LINQ. Bookmark the permalink. Leave a comment.
Leave a comment
Comments 0