Using a GUID as the ID in a database with ASP.NET MVC
asp.net-mvc, guid
Solution
You could use a custom ModelBinder. I learned about those over here.
public class MyClassBinder : DefaultModelBinder {
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) {
var model = (Movie)base.CreateModel(controllerContext, bindingContext, modelType);
model.id = Guid.NewGuid();
return model;
}
}
And your action controller would be:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MyAction(Movie movieToCreate) {
// movie should have a new guid in the id
_entities.AddToMovieSet(movieToCreate);
_entities.SaveChanges();
}
And you would need to register the binder in Global.asax:
protected void Application_Start() {
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.Add(typeof(Movie), new MyClassBinder());
}
Problem
I am learning ASP.NET MVC. I am following one of the basic tutorials on asp.net. Since I do not always follow the tutorials to the letter, I decided to use a GUID as the identity column instead of an integer. Everything was working fine until I got up to the point of adding a new record to the database through the MVC application. When I added the new record, it inserted a blank GUID instead of a generated one. Here is the segment of code-behind that handles the insertion: ``` [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create([Bind(Exclude = "id")]Movie movieToCreate) { try { _entities.AddToMovieSet(movieToCreate); _entities.SaveChanges(); return RedirectToAction("Index"); } catch { return View(); } } ``` The `[Bind(Exclude = "id")]` line 'ignores' the ID column, since it is autogenerated. In the tutorial, the ID is auto-incremented but I think that is because it is an integer. I tried adding a line to this method: ``` [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create([Bind(Exclude = "id")]Movie movieToCreate) { try { movieToCreate.id = Guid.NewGuid(); _entities.AddToMovieSet(movieToCreate); _entities.SaveChanges(); return RedirectToAction("Index"); } catch { return View(); } } ``` But the id is still an empty GUID. Can anyone provide me with some information on why this is and perhaps how to resolve it?