I am working on an ASP.NET MVC-4 web application. I’m defining the following inside my action method to build a
ViewBag.CustomerID = new SelectList(db.CustomerSyncs, "CustomerID", "Name");
Then I am rendering my
DropDownListFor as follow inside my
@Html.DropDownListFor(model => model.CustomerID, (SelectList)ViewBag.CustomerID, "please select")
As shown I am naming the
ViewBag property to be equal to the
Model property name which is
CustomerID. From my own testing, defining the same name didn’t cause any problem or conflict but should I avoid this ?
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
You should not use the same name for the model property and the
ViewBag property (and ideally you should not be using
ViewBag at all, but rather a view model with a
@Html.DropDownListFor(m => m.CustomerId, ....) the first
"Please Select" option will always be selected even if the value of the model property has been set and matches one of the options. The reason is that the method first generates a new
IEnumerable<SelectListItem> based on the one you have supplied in order to set the value of the
Selected property. In order to set the
Selected property, it reads the value of
ViewData, and the first one it finds is
"IEnumerable<SelectListItem>" (not the value of the model property) and cannot match that string with any of your options, so the first option is selected (because something has to be).
@Html.DropDownList("CustomerId", ....), no
data-val-* attributes will be generated and you will not get any client side validation
Refer this DotNetFiddle showing a comparison of possible use cases. Only by using different names for the model property and the
ViewBag property will it all work correctly.
There is not harm to use it. You will not get any error. but best practice is to bind model property.