Step 1:
I\'m using a dropdown to display company locations. The list comes from the Location table.
Step 2:
While the user is registering, the drop
Create a ViewModel for your form
public class CompanyViewModel
{
public int CompanyId { set;get;}
// Other properties of Company
public int SelectedLocationId { set;get;}
public IEnumerable<Location> Locations { set;get;}
}
Assuming you have a Location class like this
public class Location
{
public int Id { set;get;}
public string Name { set;get;}
}
In the Register (HTTPGET
) Action method, Return a CompanyViewModel object with Locations filled from database to the View
public ActionReuslt Register()
{
CompanyViewModel model=new CompanyViewModel();
model.Locations =myRepositary.GetAllLocations();
return View(model);
}
Assuming GetAllLocations
returns a list of Location objects from your repositary.
And in the Register View which is strongly typed to CompanyViewModel
@model CompanyViewModel
@using(Html.BeginForm())
{
@Html.DropDownListFor(x=>x.SelectedLocationId,
new SelectList(Model.Locations ,"Id",
"Name"),"Select Location")
<input type="submit" value="Save" />
}
Now write an HTTPPost
actionmethod to handle the form post(when user submits the form)
[HttpPost]
public ActionResult Register(CompanyViewModel model)
{
if(ModelState.IsValid)
{
// You will have selected Location id available in model.SelectedLocationId property now
//Save and redirect.
}
//Model Validation failed. so Let us reload the locations again
//because HTTP is stateless and ASP.NET MVC is true to HTTP ! :)
model.Locations =myRepositary.GetAllLocations();
return View(model);
}
It depends how you are getting values of your form if you are passing formcollection then simply you can access its value by this
public ActionResult MyAction (FormCollection form)
{
string value = form["DropDownListName"];
}
Or you can access it through
string value = Request.Form["DropDownListName"];
Here is some sample code that you can modify and use in your scenario. I don't know what your code looks like so I created my own.
In your view:
@model YourProject.ViewModels.YourViewModel
Your locations dropdown:
<td><b>Location:</b></td>
<td>
@Html.DropDownListFor(
x => x.LocationId,
new SelectList(Model.Locations, "Id", "Name", Model.LocationId),
"-- Select --"
)
@Html.ValidationMessageFor(x => x.LocationId)
</td>
Your view model:
public class YourViewModel
{
// Partial class
public int LocationId { get; set; }
public IEnumerable<Location> Locations { get; set; }
}
Your create action method:
public ActionResult Create()
{
YourViewModel viewModel = new YourViewModel
{
// Get all the locations from the database
Locations = locationService.FindAll().Where(x => x.IsActive)
}
// Return the view model to the view
// Always use a view model for your data
return View(viewModel);
}
[HttpPost]
public ActionResult Create(YourViewModel viewModel)
{
if (!ModelState.IsValid)
{
viewModel.Locations = locationService.FindAll().Where(x => x.IsActive);
return View(viewModel);
}
// If you browse the values of viewModel you will see that LocationId will have the
// value (unique identifier of location) already set. Now that you have this value
// you can do with it whatever you like.
}
Your location class:
public class Location
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
}
This is simple as can come. I hope this helps :)
UPDATE:
My service layer is there for any further business logic and then it calls my repository layer to get the data from the database. I use Entity Framework code first. I also use Autofac for my IoC container.
Your service layer:
public class LocationService : ILocationService
{
private readonly ILocationRepository locationRepository;
public LocationService(ILocationRepository locationRepository)
{
this.locationRepository = locationRepository;
}
public IEnumerable<Location> FindAll()
{
return locationRepository.FindAll();
}
}
And your repository:
public class LocationRepository : ILocationRepository
{
YourDbContext db = new YourDbContext();
public IEnumerable<Location> FindAll()
{
return db.Locations.OrderBy(x => x.Name);
}
}
Your database context class:
public class YourDbContext : DbContext
{
public DbSet<Location> Locations { get; set; }
}