5
votes

I am trying to pass sub object in a partial view to another, and I always get the error. Can anyone help me to solve this? T.T

"The model item passed into the dictionary is of type 'Application.Models.PetModel', but this dictionary requires a model item of type 'Application.Models.Calendar'"

Main model

public class PetModel
{

    public string Name { get; set; }
    public long SpeciesID { get; set; }
    public long BreedID { get; set; }
    public Calendar DOB { get; set; }

}

Sub Model

   public class Calendar
    {
        public int Day { get; set; }
        public int Month { get; set; }
        public int Year { get; set; }

        public DateTime DateObj
        {
            get
            {
                if (Day != 0 && Month != 0 && Year != 0)
                {
                    return new DateTime(Year, Month, Day);
                }

                return DateTime.Now;
            }

            set
            {
                if (value != null)
                {
                    Day = value.Day;
                    Month = value.Month;
                    Year = value.Year;
                }
            }
        }

    }

Main View

@model Application.Models.PetModel
@using (Html.BeginForm("CatchPetContent", "Quote",Model))
{
    @Html.Partial("PetDetailsContent", Model)
    <input type="submit" value="submit" />
}

PetDetailsContent Partial View

@model Application.Models.PetModel
@Html.TextBoxFor(x => x.Name)
@Html.DropDownListFor(x => x.SpeciesID, (IEnumerable<SelectListItem>)ViewData["TypeList"], "--Please Select--")
 @Html.DropDownListFor(x => x.BreedID, (IEnumerable<SelectListItem>)ViewData["BreedList"], "--Please Select--")
@Html.RenderPartial("UserControl/Calendar", Model.DOB)

Calendar Partial view

@model Application.Models.Calendar
 @Html.TextBoxFor(x => x.Day)
 @Html.TextBoxFor(x => x.Month)
 @Html.TextBoxFor(x => x.Year)
4

4 Answers

4
votes

I have got the same problem. In my case whenever the sub-model is null, framework is passing the main model to the partial view.

As a workaround I check if the sub-model is null before passing it to the partial view. If its null then I either dont show the partial view at all or create an instance of the sub-model. (Again, its a workaround until I find the proper solution for this issue. If there is one.)

1
votes

Change This,

@Html.RenderPartial("UserControl/Calendar", Model.DOB)

you have DOB property of type Calender in your PetModel model.

1
votes

You could try using @Html.Partial("UserControl/Calendar", Model.DOB) instead of RenderPartial. I know in some cases, the RenderPartial doesn't allow values to pass back properly.

0
votes

PetModel does not contain "PetName"

PetDetailsContent Partial View

@Html.TextBoxFor(x => x.PetName)