Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any good reason to use FormCollection instead of ViewModel?

I've inherited a code base written in ASP.Net MVC 4. Every post method takes a FormCollection. Aside from annoyance of having to access the values through quoted strings, it also leads to drawbacks such as not being able to use things like ModelState.IsValid, or [AllowHtml] attributes on my ViewModel properties. They actually did create ViewModel classes for each of their views, (though they are pretty much just direct wrappers around the actual Entity Framework Model classes), but they are only used for the GET methods.

Is there anything I'm missing about FormCollection that gives a reason why this may have actually been a good idea? It seems to only have drawbacks. I'd like to go through and "fix" it by using ViewModels instead. This would take a good bit of work because the ViewModels have properties that are interfaces and not concrete classes, which means either writing a custom binder or changing the ViewModels.

But perhaps there's something I'm missing where it makes sense to use FormCollection?

like image 984
GendoIkari Avatar asked Jun 08 '13 17:06

GendoIkari


People also ask

Should I use ViewModels?

The ViewModel is essential when you want a separation of concerns between your DomainModel (DataModel) and the rest of your code.

Is there any use of ViewModel of MVC?

What ViewModel is. In ASP.NET MVC, ViewModels are used to shape multiple entities from one or more models into a single object. This conversion into single object provides us better optimization. You can see the concept of ViewModel in the image below.

What is the difference between model and ViewModel?

A model is usually more closely related to how your data is stored (database, services, etc.) and the model will closely resemble those. The ViewModel on the other hand is closely related to how your data is presented to the user. It is usually a flatten version of your model, denormalized, etc.

Can ViewModels have methods?

You can have methods in your ViewModel .


2 Answers

Is there any good reason to use FormCollection instead of ViewModel?

No. I have following issues.

Issue - 1

In case FormCollection is being used...It will be mandatory to Type Cast the Primitive Type Values un-necessarily because while getting the entry of specific Index of the System.Collections.Specialized.NameValueCollection, value being returned is of type String. This situation will not come in case of Strongly Typed View-Models.

Issue - 2

When you submit the form and goes to Post Action Method, and View-Model as Parameter exists in the Action method, you have the provision to send back the Posted Values to you View. Otherwise, write the code again to send back via TempData/ViewData/ViewBag

enter image description here

View-Models are normal classes, created to bind data to-from Views

Issue - 3

We have Data Annotations that can be implemented in View Model or Custom Validations.

enter image description here

ASP.Net MVC simplifies model validatons using Data Annotation. Data Annotations are attributes thyat are applied over properties. We can create custom validation Attribute by inheriting the built-in Validation Attribute class.



Issue - 4

Example you have the following HTML

<input type="text" name="textBox1" value="harsha" customAttr1 = "MyValue" /> 

Question : How can we access the value of customAttr1 from the above eg from inside the controller

Answer : When a form get posted only the name and value of elements are posted back to the server.

Alternatives : Use a bit of jQuery to get the custom attribute values, and post that along with the form values to action method

Another option is to rather put what you got in your custom attributes in hidden controls




That's the reason, I would always prefer to use View-Models

like image 188
Imad Alazani Avatar answered Sep 18 '22 21:09

Imad Alazani


The only advantage I can think of is if you want to use the automatically generated controller provided when you don't specify a EF model to be strongly typed to. In that case, your Create and Edit actions will use the FormCollection object as it is a reliable, pre-existing artifact of the framework to work with for this purpose. Perhaps the previous developer chose this option while creating his controllers, and stuck with it since Visual Studio must know what it's doing :)

But, in reality, I would never recommend this headstart of a few seconds. It's always better to build out viewmodels, I would recommend looking at the effort to move in that direction if only for maintenance purposes. With model binding and strongly typed views and html helpers, you are much more likely to reduce the number of run-time errors as a result of changing some magic string and not realizing it until your page blows up.

like image 32
Mister Epic Avatar answered Sep 22 '22 21:09

Mister Epic