EcoRail validation
Here is yesterday's update.
I wanted a way to validate the user input. Seeing as there are constraints in the model to me this was the obvious approach to take. The HTML in my main layout (MasterPage) was changed like so
This outputs all errors passed in PropertyBag["Errors"] or in my case I used Flash["Errors"].
To validate my product input I changed my controller like so:
GetErrorsForAllDirtyObjects uses the DefaultEcoSpaceType to find the EcoSpace instance and then checks all constraints of all dirty objects in order to return a list of strings. Available validation routines are
Now I have to take into account that not everyone wants to have their error messages returned from OCL constraints defined in the model. To cater for this my validation routines do not directly read the model, instead they use a virtual property
The default implementation returns an instance of ModeledConstraintProvider which is a class in the DroopyEyes.Eco.Extensions project, but you can now override this property on your controller and return any implementation you like.
So now I have OCL validation from the model. Next I think I will add an EcoModelHelper so that you can obtain information from the model, to start with I think all I will implement is something like the following
I wanted a way to validate the user input. Seeing as there are constraints in the model to me this was the obvious approach to take. The HTML in my main layout (MasterPage) was changed like so
<body>
#if ($Errors && $Errors.Count > 0)
<ul class="errors">
#foreach ($currentError in $Errors)
<li>$currentError</li>
#end
</ul>
#end
$childContent
</body>
This outputs all errors passed in PropertyBag["Errors"] or in my case I used Flash["Errors"].
To validate my product input I changed my controller like so:
[AllowEcoSpaceDeactivateDirty(true)]
public void Modify([EcoDataBind("Product", Allow = "ID,Name", NoObjectIdAction = ObjectIdAction.CreateNewInstance)]Product product)
{
PropertyBag["Product"] = product;
IList<string> errors = GetErrorsForAllDirtyObjects();
if (errors.Count > 0)
Flash["Errors"] = errors;
else
{
EcoSpace.UpdateDatabase();
RedirectToAction("List");
}
}
GetErrorsForAllDirtyObjects uses the DefaultEcoSpaceType to find the EcoSpace instance and then checks all constraints of all dirty objects in order to return a list of strings. Available validation routines are
- protected IList<string> GetErrorsForObject(IObjectProvider instance)
- Gets error messages for broken constraints on a single object
- protected IList<string> GetErrorsForAllDirtyObjects(Type ecoSpaceType)
- Gets the EcoSpace instance of the type specified and then returns errors messages for broken constraints on all modified objects
- protected IList<string> GetErrorsForAllDirtyObjects()
- Calls GetErrorsForAllDirtyObjects(Type ecoSpaceType) using the DefaultEcoSpaceType specified
Now I have to take into account that not everyone wants to have their error messages returned from OCL constraints defined in the model. To cater for this my validation routines do not directly read the model, instead they use a virtual property
private IConstraintProvider m_ConstraintProvider;
protected virtual IConstraintProvider ConstraintProvider
{
get
{
if (m_ConstraintProvider == null)
m_ConstraintProvider = new ModeledConstraintProvider();
return m_ConstraintProvider;
}
}
The default implementation returns an instance of ModeledConstraintProvider which is a class in the DroopyEyes.Eco.Extensions project, but you can now override this property on your controller and return any implementation you like.
So now I have OCL validation from the model. Next I think I will add an EcoModelHelper so that you can obtain information from the model, to start with I think all I will implement is something like the following
$EcoModelHelper.Length("Person", "FirstName")
Comments