Reputation: 1875
I'm converting over to MVC 3 from Webforms and have been having some trouble teaching myself. I created a ViewModel which should populate 3 separate select lists with Month, Day, Year values within my _Header. I think I have a structure issue. The end result is that I cause an unhandled exception in the www service on my machine and Visual Studio pops up and wants me to debug it. Any help would be greatly appreciated!
Here's my code.
DateSearchViewModel.cs
namespace DH.ViewModels
{
public class DateSearchViewModel
{
//MONTH DROPDOWN LIST
public class MonthViewModel
{
public int ID { set; get; }
public string Month { set; get; }
}
private List<MonthViewModel> _months;
public List<MonthViewModel> Months
{
get
{
if (_months == null)
{
_months = new List<MonthViewModel>();
_months.Add(new MonthViewModel { ID = 1, Month = "Jan" });
_months.Add(new MonthViewModel { ID = 2, Month = "Feb" });
_months.Add(new MonthViewModel { ID = 3, Month = "Mar" });
_months.Add(new MonthViewModel { ID = 4, Month = "Apr" });
_months.Add(new MonthViewModel { ID = 5, Month = "May" });
_months.Add(new MonthViewModel { ID = 6, Month = "Jun" });
_months.Add(new MonthViewModel { ID = 7, Month = "Jul" });
_months.Add(new MonthViewModel { ID = 8, Month = "Aug" });
_months.Add(new MonthViewModel { ID = 9, Month = "Sep" });
_months.Add(new MonthViewModel { ID = 10, Month = "Oct" });
_months.Add(new MonthViewModel { ID = 11, Month = "Nov" });
_months.Add(new MonthViewModel { ID = 12, Month = "Dec" });
}
return _months;
}
}
public int SelectedMonthID { set; get; }
//DAY DROPDOWN LIST
public class DayViewModel
{
public int ID { set; get; }
public string Day { set; get; }
}
private List<DayViewModel> _days;
public List<DayViewModel> Days
{
get
{
if (_days == null)
{
_days = new List<DayViewModel>();
_days.Add(new DayViewModel { ID = 1, Day = "1" });
_days.Add(new DayViewModel { ID = 2, Day = "2" });
_days.Add(new DayViewModel { ID = 3, Day = "3" });
_days.Add(new DayViewModel { ID = 4, Day = "4" });
_days.Add(new DayViewModel { ID = 5, Day = "5" });
_days.Add(new DayViewModel { ID = 6, Day = "6" });
_days.Add(new DayViewModel { ID = 7, Day = "7" });
_days.Add(new DayViewModel { ID = 8, Day = "8" });
_days.Add(new DayViewModel { ID = 9, Day = "9" });
_days.Add(new DayViewModel { ID = 10, Day = "10" });
_days.Add(new DayViewModel { ID = 11, Day = "11" });
_days.Add(new DayViewModel { ID = 12, Day = "12" });
_days.Add(new DayViewModel { ID = 1, Day = "13" });
_days.Add(new DayViewModel { ID = 2, Day = "14" });
_days.Add(new DayViewModel { ID = 3, Day = "15" });
_days.Add(new DayViewModel { ID = 4, Day = "16" });
_days.Add(new DayViewModel { ID = 5, Day = "17" });
_days.Add(new DayViewModel { ID = 6, Day = "18" });
_days.Add(new DayViewModel { ID = 7, Day = "19" });
_days.Add(new DayViewModel { ID = 8, Day = "20" });
_days.Add(new DayViewModel { ID = 8, Day = "21" });
_days.Add(new DayViewModel { ID = 8, Day = "22" });
_days.Add(new DayViewModel { ID = 8, Day = "23" });
_days.Add(new DayViewModel { ID = 8, Day = "24" });
_days.Add(new DayViewModel { ID = 8, Day = "25" });
_days.Add(new DayViewModel { ID = 8, Day = "26" });
_days.Add(new DayViewModel { ID = 8, Day = "27" });
_days.Add(new DayViewModel { ID = 8, Day = "28" });
_days.Add(new DayViewModel { ID = 8, Day = "29" });
_days.Add(new DayViewModel { ID = 8, Day = "30" });
_days.Add(new DayViewModel { ID = 8, Day = "31" });
}
return _days;
}
}
public int SelectedDayID { set; get; }
//YEAR DROPDOWN LIST
public class YearViewModel
{
public int ID { set; get; }
public string Year { set; get; }
}
private List<YearViewModel> _years;
public List<YearViewModel> Years
{
get
{
if (_years == null)
{
_years = new List<YearViewModel>();
_years.Add(new YearViewModel { ID = 1, Year = "2009" });
_years.Add(new YearViewModel { ID = 2, Year = "2010" });
_years.Add(new YearViewModel { ID = 3, Year = "2011" });
_years.Add(new YearViewModel { ID = 4, Year = "2012" });
}
return _years;
}
}
public int SelectedYearID { set; get; }
}
}
CommonController.cs:
[ChildActionOnly]
public ActionResult _Header()
{
DateSearchViewModel DateVM = new DateSearchViewModel();
return View(DateVM);
}
_Header.cshtml:
@model DH.ViewModels.DateSearchViewModel
@Html.DropDownListFor(x => x.SelectedMonthID, new SelectList(Model.Months, "ID", "Month"), "--Select--")
@Html.DropDownListFor(x => x.SelectedDayID, new SelectList(Model.Days, "ID", "Day"), "--Select--")
@Html.DropDownListFor(x => x.SelectedYearID, new SelectList(Model.Years, "ID", "Year"), "--Select--")
_Layout.cshtml:
@{Html.RenderAction("_Header", "Common");}
Upvotes: 1
Views: 2623
Reputation: 27282
I feel like your model is overcomplicated...having a view model for moth day and year strikes me as overkill. I would just implement those as properties. Here's how I would accomplish this:
The model:
public class DateSearchViewModel {
public int Day { get; set; }
public int Month { get; set; }
public int Year { get; set; }
}
The controller:
public ActionResult _Header() {
DateSearchViewModel DateVM = new DateSearchViewModel();
return View(DateVM);
}
public ActionResult _Header( DateSearchViewModel vm ) {
if( ModelState.IsValid ) {
// save vm to database, etc.
}
return View(vm);
}
And the view:
@{
var days = new List<SelectListItem>();
for( var i = 1; i <= 31; i++ ) {
days.Add( new SelectListItem { Text = i.ToString(), Value = i.ToString(), Selected = Model.Day == i } );
}
var months = new List<SelectListItem> {
new SelectListItem {Text = "Jan", Value = "1", Selected = Model.Month == 1},
new SelectListItem {Text = "Feb", Value = "2", Selected = Model.Month == 2},
new SelectListItem {Text = "Mar", Value = "3", Selected = Model.Month == 3},
new SelectListItem {Text = "Apr", Value = "4", Selected = Model.Month == 4},
new SelectListItem {Text = "May", Value = "5", Selected = Model.Month == 5},
new SelectListItem {Text = "Jun", Value = "6", Selected = Model.Month == 6},
new SelectListItem {Text = "Jul", Value = "7", Selected = Model.Month == 7},
new SelectListItem {Text = "Aug", Value = "8", Selected = Model.Month == 8},
new SelectListItem {Text = "Sep", Value = "9", Selected = Model.Month == 9},
new SelectListItem {Text = "Oct", Value = "10", Selected = Model.Month == 10},
new SelectListItem {Text = "Nov", Value = "11", Selected = Model.Month == 11},
new SelectListItem {Text = "Dec", Value = "12", Selected = Model.Month == 12},
};
var years = new List<SelectListItem>();
for( var i = 2009; i <= 2012; i++ ) {
years.Add( new SelectListItem { Text = i.ToString(), Value = i.ToString(), Selected = Model.Year == i } );
}
}
@using( Html.BeginForm() ) {
@Html.DropDownListFor( x => x.Month, months )
@Html.DropDownListFor( x => x.Day, days )
@Html.DropDownListFor( x => x.Year, years )
<input type="submit" />
}
Upvotes: 4