@ Html.DropDownListFor在局部视图中失败,但在整页视图中失败

时间:2013-05-30 12:30:47

标签: c# asp.net-mvc ienumerable html.dropdownlistfor asp.net-mvc-partialview

我遇到的问题是我的PartialView DropDownListFor收到错误:

The ViewData item that has the key PlanId is of type System.int32 but must be of type   
IEnumerable<SelectListItem>

@Html.DropDownListFor(model => model.PlanId, (SelectList)ViewBar.PlanNameSelectList, new {@class = "short" })  

当我转到最初持有此代码的页面时,不会弹出此错误。我所做的就是将代码的核心部分与之前的另一个部分视图一起使用,只要我在代码中取出了DropDownListFor元素。我不需要它们用于那个partialView,但是现在我需要它们,问题已经完全循环了。

我非常感谢能帮助解决这个问题的任何帮助。其他资源如部分调用在

之下
@Html.Partial("location", new MAO.Models.ViewModels.CreateTemplateModel{})

这是模型

public class CreateTemplateModel {
    [Required(ErrorMessage = "{0} is required.")]
    [RegularExpression("^[0-9]+$", ErrorMessage="Template Id can only contain numbers")]
    [Display(Name = "Template ID")]
    public string TNumber { get; set; }

    [Required(ErrorMessage = "{0} is required.")]
    [RegularExpression("^.[0-9]{4}(-[0-9]{3})?$", ErrorMessage = "H# Must follow either @XXXX or @XXXX-XXX pattern")]
    [Display(Name = "HNumber")]
    public string HNumber { get; set; }

    [RequiredIfOtherIsEmpty("NewPlanName", ErrorMessage = "Please enter a Plan Name")]
    [Display(Name = "Select Existing Plan Name")]
    public int PlanId { get; set; }

    [MaxLength(500, ErrorMessage="{0} can't be longer than 500 characters")]
    [Display(Name = "Enter New Plan Name")]
    public string NewPlanName { get; set; }

    [RequiredIfOtherIsEmpty("NewParentOrganization", ErrorMessage = "Please enter a Parent Organization")]
    [Display(Name = "Select Existing Parent Organization")]
    public string ParentOrganization { get; set; }

    [MaxLength(500, ErrorMessage = "{0} can't be longer than 500 characters")]
    [Display(Name = "Enter New Parent Organization")]
    public string NewParentOrganization { get; set; }

    [Required(ErrorMessage = "{0} is required.")]
    public int TemplateTypeId { get; set; }
}

有一个控制器很长,所以我不打算发布。如果控制器的某些部分有用,我可以发布这些部分以及我可能忘记包含的任何其他部分

1 个答案:

答案 0 :(得分:2)

根据您的评论,我怀疑您在返回部分视图时永远不会重新绑定下拉列表。您对partial的控制器操作应该以与呈现完整视图的控制器操作相同的方式构建下拉列表。比较两者并确保它们匹配。

更新:您的部分查看操作应如下所示:

public ActionResult Location()
{
    ViewBag.PlanNameSelectList = new SelectList(plans.Distinct(), "Id", "Name", plans.FirstOrDefault(plan => plan.Name == selectedPlan));
    attachSelectLists(ViewBag); 
    return PartialView("Location");
}

您目前正在做什么

@Html.Partial("location", new MAO.Models.ViewModels.CreateTemplateModel{})

使用新的CreateTemplateModel对象渲染局部视图“location”,而不是现有的。相反,更好的方法是复制控制器操作。专门为您的局部视图创建一个新的(现在这是一个更简单的用例)。

public ActonResult TestPartialView()

而不是使用呈现部分的@ Html.Partial,而是尝试调用新的控制器操作,这将为您构建下拉列表。

@Html.RenderAction("TestPartialView").

这将调用您的新控制器操作并在页面上呈现部分,保留控制器逻辑。如果你使用@ Html.Partial,它只是渲染部分视图传入你给它的任何对象,在这种情况下,它是一个新的空CreateTemplateModel。