How to change models editable atttribute based on a condition - c#

Based on user credentials, I will allow users to edit a field or not on a Razor View.
So I currently have one model which I can do this for the properties I forbid:
[Editable(allowEdit=false)]
public string FirstName {get;set;}
but when I add the attribute whether or not a user has permission to edit it, they won't be able to. I cannot change the fields in Razor View either as we use a very different way of rendering model properties.
Any idea how can I overcome this problem?

You might want to create custom validation attribute and use that, in it you can inject your boolean and check and make it conditional (in C#).
The better option is to use Fluent Validation - its much easier to work with in these cases, when you need conditional validation. Also it will keep your models cleaner.
So if you can - use Fluent validation, if not, just define your own property and control it in your code including all conditions. Examples and links to libraries are here
Here is another option for you - complete library built with aim to easy the work you trying to achieve : http://foolproof.codeplex.com/
Hope this helps

Related

C# MVC Custom Attributes

I have model based on existing database and I have written metadata class and custom attribute class, Now I want to convert all custom attribute logic into Jquery or Javascript custom function, Please guide me simple or any available free tool for the same.
rcdmk and Scott Selby have provided excellent resources for how to implement the IClientValidatable interface to integrate with jquery unobtrusive validation. As an alternative, if you don't want to maintain javascript versions of your validation logic, you could use the RemoteAttribute class to instruct the unobtrusive validation to perform an ajax request to validate the data (in fact in some cases this would be the only proper way to validate something - such as username availability).
RemoteAttribute Class
How to: Implement Remote Validation in ASP.NET MVC
To this moment, there's not a tool for converting custom validator in c# to custom client side validator in JavaScript [that I know of].
I advice you to look for custom validators already built on the web, like http://foolproof.codeplex.com/. Some of them may have what you need and if you can't find one that suits your requirements, follow some tutorials on how to build your own and, maybe, start your own open source project. Since you needed it, others may need it too.
Some tutorials on how to build your own custom validators may get you where you want:
http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx
http://www.codeproject.com/Articles/301022/Creating-Custom-Validation-Attribute-in-MVC-3
And this is one of my favorite references:
http://anthonyvscode.com/2011/07/14/mvc-3-requiredif-validator-for-multiple-values/
With all this in hand I'm sure you will succeed in create your own client side validators.
You should definitely look at unobtrusive validation in MVC. It adapts MVC to work with Jquery and Jquery validate plugins using data attributes within HTML markup. Once you add a Custom Validation Attribute you must also inherit and implement IClientValidatable. See the following links for more information.
http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html
http://www.codeproject.com/Articles/275056/Custom-Client-Side-Validation-in-ASP-NET-MVC3
I don't know what your requirements are for your validation , but jQuery validate plugin
should handle it. It validates for a lot of common needs automatically (phone number, number, empty text, email) it is also very easy to add custom validation if needed.

Conditional rule evaluation with FluentValidation.NET

What I want to achieve can be roughly summarized as a simple OR conditional.
Whilst there is support for conditional property validation on OTHER properties with Fluent Validation (When/Unless) there does not appear to be a way to support conditional rules on the same property? Or am I missing something?
Essentially I want to achieve:
RuleFor(x => x.Property).CanEitherValidateThisRule().Or.CanValidateThisRule();
The only alternative to this is to combine the rules in a single custom rule?
However, this tightly couples the rule logic and realistically they are completely separate conditions that I may want to use on other objects/fields.
There was a suggestion to support this in a future version of FluentValidation.NET, does anyone know a way to achieve this with extension methods or if there is a syntax that I've missed?
EDIT: Found the discussion: Fluent Validation for .NET - View Discussion
You can try Chaining Validators for the Same Property
Although its a dirty way to do what you want, its still worth if you are doing the validations for a small part of code.
If you want a cleaner way, then,as of now, I think creating a custom validator class is the most convenient option.
The wiki page I have linked to gives all the necessary tools to start with.

Validation with Model Binding against 3rd party library

I want to use class annotations to validate a razor form that collects data for properties of a third party's library class which I cant edit.
Of course I could just make a copy of the class and place the validation annotations on that but this would be ugly and difficult to maintain.
What do people consider best practice for this?
You could use FluentValidation.NET instead of data annotations. It allows you to define validation rules in a separate file. It also allows you to define complex validation scenarios which would be difficult to achieve using the data annotations declarative approach.

Dynamically add inputs to view for properties

Unfortunately I'm relatively new to MVC so what I am trying to do might be quite simple or not even possible in MVC.
I have a series of template classes in a library which can have template added, change or removed between versions. What I am trying to do is create a page that will allow for the user to select from a drop down list which template they wish to work on and then once they have selected the template be able to populate the properties of the template through text boxes, drop down lists, date selectors etc.
Whilst I could in theory create a View for each of the different templates, I would like to avoid that as if the templates can be added/changed/removed with newer versions of the library, I would like to avoid having to rewrite the Views each time that happens.
Does anyone have any suggestions on how I might be able to achieve this or know of existing references dicussing this?
If I've missed out any information which would be of use please let me know.
Thanks for any help/advice in advance.
Satal
Without writing the code, what you are looking for is a component that builds html based on what model/object it is passed to satisfy the population of that model via a web browser.
I dare say that this is possible!
An easy or easier route would be:
Decorate the properties within your template models with attributes that would dictate what sort of input control they require.
Also decorate the properties with an attribute that specifies the name of the attribute.
Create a component that accepts a model/type and creates HTML to satisfy the input of that type. Of course this must be rendered within a form.
On postback/submit to your action use the Request["{propertyName}"] to get the value of input fields to populate the properties.
Your controller action will accept the name of the Template so that you know which model to create
System.ComponentModel.DataAnnotations is a good place to start before writing your own custom attributes.

Data-annotation getting errormessage out database

With asp.net mvc you can use the annotation
[Required (errormessage="This is required")]
How can I create something like this:
[Required (errormessage="ERRORXX")]
So I can look up in a database what this ERRORXX is and display it on my form. Now my form displays ERRORXX.
How can I create something that solves my problem?
Thx!
Just an idea: why not pull the error messages from a resx file? I think this is the common way of doing this. It even allows you to localize your error messages easily.
I think that by using a resource file (resx file) it's even easier to change the error messages later on. A resx file can be opened and edited in Word Pad for example. You don't need to access a database with username/password, query it, etc.
Localizing ASP.NET MVC Validation
Globalizing ASP.NET MVC Client Validation
Take a look here too:
Model Validation & Metadata in ASP.NET MVC 2
Customizing ASP.NET MVC 2 - Metadata and Validation
The default route to take is with Resources.
However, I understand your pain :) The way I've achieved it is a little unusual, but I'll give you a quick rundown.
In our project, using resource files is not an option as its way too limited for our purposes, the details of which I won't bore you with now! :)
At it's most basic principle, we're setting the errorMessage property of the validation attribute to some sort of "key", and then just using that as a way to lookup the correct (languaged) response in our CMS database, when the validation fails (in our case using MVC, when we update the model and check the state - all at Controller level).
This is the same principle as using the resources (by specifying "ErrorMessageResourceName" and "ErrorMessageResourceType"), but you get to do what you want with it.
To be clear, we originally extended the RequiredAttribute (as one example) with our own stuff, including putting in properly named arguments to allow us to retrieve a sensible CMS value from the database later on. To be extra clear, we're using MVC and custom HtmlHelpers to render our own ValidationControls, which are what ultimately consume the custom values from our custom annotations, etc - None of this affects the dumbed-down principle here though, which is to just use "errorMessage" , or something like it, as a way to look up the actual message from where YOU want to, and WHEN you want to.
I think you mean you want to read/use attribute declarations for a given property?
If so, you could either make your own RequiredAttribute class (to allow adding new or more appropriate properties as you wish). See: Attributes Tutorial

Categories