I've just installed MVC 3 and have the following problem. Even if I try to run the sample project, that is included in MVC 3 installation, when I go to the Register form, only the Required attribute causes validation. The Email Format attribute doesn't work,which means I can enter non-email string into the email field and it submits the form without any error messages.
I am using a model but as I want to have clean views I use the viewmodel approach which is like a downsized model which I map in my controller actions before sending to the view or getting it back in a HttpPost attributed action.
My question is: where to put the data annotation attributes. On the viewmodel classes or on the model? If I get it clearly the viewmodel annotations are used for the client side generation of validation right?
Do does that mean I have to put data annotations everywhere on both model and viewmodel?
I have found hints that MVC 2 recognises the 'buddy class' type of property metadata, where data annotation attributes are applied to a 'buddy' metadata class, and the MetadataType on the actual entity class points to that buddy class, as below. However, as below, it seems the only attribute that makes any difference to the rendered UI is DisplayName. Why are the other attributes like DataType, Required, and ReadOnly not working? I.e. why can I enter text in a read only field? Why do I not get an error when a required field is empty? Why does the DataType attribute have no apparent effect? Why does EditorForModel not include validation messages?
[MetadataType(typeof(CustomerMetadata))] public partial class Customer { public class CustomerMetadata { [ScaffoldColumn(false)] public object CustomerId { get; set; } [DisplayName("CustomerNo.")] [ReadOnly(true)] [Required(AllowEmptyStrings = false, ErrorMessage = "Customer No. is required.")] public object CustomerNo { get; set; } } }
I find behaviour the same whether I use an explicit LabelFor and TextBoxFor for each model property, or a single EditorForModel for the whole model.
So I've eagerly added the System.ComponentModel.DataAnnotations namespace to my model.
I've added things such as:
[Required] [DisplayName("First Name")] public string first_name {get;set;}
I really like these attributes because they save me from having to write custom T4 and/or modify views heavily. This way, I can regenerate a view confident that it will add the display names I want, etc.
The problem comes in when I started building a DataGrid helper inspired by the one in ASP.NET MVC2 unleashed. In this helper, Stephen uses reflection to get at the column headings.
var value=typeOf(T).GetProperty(columnName).GetValue(item,null) ?? String.Empty;
Well, the trouble is I don't want to retrieve the property name. I want to retrieve the value for the DisplayName attribute.
My first attempt at this was to look inside the Attributes property of the PropertyInfo class. Unfortunately, none of the data annotations show up as an attribute.
Is there a way to retrieve the data annotations using reflection?
In one my web page i've an updatepanel which contains a gridview .The gridview displays huge amt of data (4 pages of data) and the updatepanel refreshes for every 1 sec,for tht i've used timer control, to get the updated data from the server.for that i've used one timer. The problem is ,the webpages scroll bar(both horizontal and vertical) is repositioning to the starting position after every refresh.
i have a field username which i want to have as a label in the edit.aspx and as a typical textbox in create.aspx . i have applied datannotation class . how would i do that. in the edit mode it is always going model.isvalid ==false . so what i did had a textbox there with the label and hid it . it is working fine now . but is there any clean way this is done in dataannotation
Technically I have the Data Annoations working with Linq to SQL classes - the problem is when validation passes. When UpdateModel() tries to do its thing i can an error:The model of type 'MyProject.Models.Employee' could not be updated.What i did was i created a partial class for Employee (that is generated by linq to sql), then stuck a Meta Data class on top of it for the validation
Wanting to create custom data annotation validation. Are there any useful guides / samples on how to create them?
Firstly: StringLength with minimum and maximum length. I'm aware .NET 4 can do this, but want to do the same in .NET 3.5, if possible being able to define minimum length only (at least x chars), maximum length only (up to x chars), or both (between x and y chars).
Secondly: Validation using modulus arithmetic - if the number is a valid length, I wish to validate using the Modulus 11 algorithm (I have already implemented it in JavaScript, so I guess it would just be a simple porting?)
Update: Solved second problem, was just a case of copying over the JavaScript implementation and making a few tweaks, so don't need a solution for that.
I have a validation attribute that inherits from ValidationAttribute. However, the particular usage of this attribute applies to lists only (IEnumerable really). How can I specify the usage of this property to only be used with items that inherit from IEnumerabe?
I have custom class level validation attribute, inheriting from ValidationAttribute, on my model.
How come it doesn't register a key in the ModelState when its IsValid is false? I can see the the error message in the ModelState.Values collection, but the ModelState.Keys collection only shows an empty string "". Can I provide a key for it - presumably this is because its not assigned to a property?
I wanna be able to use ModelState.Remove in my controller to remove this error upon a certain condition, but I have no Key!
Something is wrong in ASP.NET MVC 2 on client side validation. If I have form for create records in database and all fields are required, validation is triggered only then when I write something in field and delete it. If I go to field, stay this field empty and press Tab key validation isn't triggered.
Here somebody else write about the same problem: [URL]
I am a MVC newbie & am lost in various ways validation can be implemented in my application.
I created a custom model-level data annotation validator attribute, but am unable to display its error message in the view. Basically, I have let's say 5 properties in the Entity class Job (model-level custom attribute called UniqueKeywords defined on it):
1) LoginID: value comes in the URL
2) Title: Required property level attribute defined on it
3) CatID1, CatID2, CatID3 - 3 categoryIDs - these are dropdowns in the view with same list of keywords in all 3.
I want to mandate that the values picked by the user in all 3 category dropdowns should be different.
With reference to the code pasted below, here is the explanation of what happens:
When I submit the form without specifying a title or picking anything from any of the 3 category dropdowns, the validation occurs for the property level Required attribute as well as model level uniquekeywords attribute, but the error is displayed only next to the required field "Title". I can confirm that the custom validation also works by filling in some text in the Title field & then re-posting the form...this re-displays the view, but the error message "Category cannot be duplicated" is not displayed.
I have generated entity framework designer classes . After Generating the designer what is the most nicest and cleanest way to apply data annotation to the properties there . I have 3 classes there
When I click submit, It does the validation on the server side, I kinda like it to validate on the Client instead of taking a trip to the server right away.
I am accessing this xml file by using LINQ to XML in asp.net by using C#. I am able to access all the attributes of an XML node by explicitly specifying the name of the attribute. I want to write query on this xml file which reads all the attribute values of the xml node (In our example the node is SERVER) dynamically means I want to write the query which can read the read the value of the attribute Name & ID from first node, only name from second row, Name, ID & Parent from the third row , Name & ID from the fourth row, Name, Parent & Value from the fifth row & only Name from the sixth row without modifying the existing code every time. Once I add one of the attribute ( for example if I add the attribute ID in the sixth row ) in the above xml file then I dont need to modify my LINQ to XML query. My query should dynamically fetch the total number of attributes & display their values. Is their any way to do this ?
Im developing a ASP .NET project. In that project i need a facility to annotate an image, ie Uploading an image and annotate some part on that image. Which is the easiest way to develop that all things....
Has anyone extended the Range attribute to be able to have a variable range?I have a similar need but I can't make this work:
public class YearRangeAttribute : RangeAttribute { public YearRangeAttribute() : base(typeof(DateTime), DateTime.Now.AddYears(-100).Year.ToString(), DateTime.Now.AddYears(-14).Year.ToString()) { } }
There is nothing on the page when it is rendered to the browser and the code above doesn't work.
I am using DataAnnotations to supply information for Inserting/Editing data into a grid. Is there a way to control the Html attributes of the DisplayNames I use, so that, for instance, the DisplayNames can be a different color from the text in the textboxes?
I have a problem with a GridView that I can't figure out. It's inside an UpdatePanel and has been working fine for a long time. Today I have added a few lines to the code behind to add javascript to each row so that the user can just click the row to view the record. This works fine too, except that it breaks the paging of the GridView and I don't understand why.
Here is my code (The controls lstStatus and txtSearch are elsewhere on the page):
[Code]....
And in the codebehind the lines which break paging are the following three, in the RowDataBound event:
[Code]....
I've tried messing with the viewstate of the UpdatePanel, changing its UpdateMode to 'Always' and it's ChildrenAsTriggers property to 'True' but none of this makes any difference, and besides, it's been working for months as it is until I introduced these three new lines into the code behind.
Can anybody see why add these attributes to the row breaks paging?
I have added a Command Field in a Gridview Dynamically. And I have added the OnClick Attribute in the RowDataBound event
[code]...
and ProceedAction() function have confirmation message. When i click the Delete button, the confirmation message is shown. But the Row Command is not fired (even if i click Ok/ cancel in the confirmation message).
I have analysised Little bit. If i have '\' or '{, }' or '*' in the javascript function, the behavior is improper (as i said above). If i remove it, it is working fine.
Since i need to ask two confirmation, i need to put '{, }' in my javascript. So how can i resolve the above issue.
I know this is simple, but i have a problem solving this.I have a listview, In the Edit template I have added a button. On ListView_Itemdatabound event, i want attributes to this button to call either a javascript function ot open a new.aspx page.On button click, i get round trip back to server. I just want it to call Javascript function or open new page.
I have a gridview, and I want to change the backcolor of any row that has the column checkedin = false.
I have this working fine, except that it will not change the backcolor of the first row and only the first row. Matter a fact if I sort the columns by clicking on the header rows the order changes and the backcolor highlights the row that was the first row before it was sorted so long as it is not the first row. I actually removed all formatting from my gridview and still the same issue.
I have a user control that displays a list of records. Users have the ability to open an embedded user control with a FormView to either add a new record or to edit an existing one. The UserControl with the FormView has a button that closes and hides the user control.
If the user control with the FormView is opened to edit a record, the code works fine. But if the UserControl is opened directly into Insert mode, the code craps out