0

我的 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 一起工作的代码的核心部分删掉。那个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; }
}

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

4

1 回答 1

2

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

更新:您的部分视图操作应如下所示:

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 对象呈现局部视图“位置”,而不是现有对象。相反,更好的方法是复制您的控制器操作。专门为您的局部视图创建一个新视图(目前这是一个更简单的用例)。

public ActonResult TestPartialView()

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

@Html.RenderAction("TestPartialView").

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

于 2013-05-30T13:06:42.890 回答