C# @Html.DropDownListFor在部分视图中失败,但在完整页面视图中失败
我的PartialView DropDownListFor出现错误:C# @Html.DropDownListFor在部分视图中失败,但在完整页面视图中失败,c#,asp.net-mvc,ienumerable,html.dropdownlistfor,asp.net-mvc-partialview,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
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" })
这就是模型
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; }
}
有一个控制器相当长,所以我不打算发布它。如果控制器的某些部分会有所帮助,我可以发布这些部分以及根据您的评论可能忘记包含的任何其他内容,我怀疑您在返回部分视图时从未重新绑定下拉列表。局部视图的控制器操作应以与呈现完整视图的控制器操作相同的方式构建下拉列表。比较两者并确保它们匹配 更新:局部视图操作应如下所示:
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对象(而不是现有对象)渲染局部视图“位置”。相反,更好的方法是复制控制器动作。为局部视图创建一个新的视图(目前这是一个更简单的用例)
不要使用@Html.Partial来呈现部分,而是尝试调用新的控制器操作,这将为您构建下拉列表
@Html.RenderAction("TestPartialView").
这将调用新的控制器操作,并在页面上呈现部分,保留控制器逻辑。如果使用@Html.Partial,它只会呈现传递给它的任何对象的局部视图,在本例中,该对象是一个新对象,空的CreateTemplateModel。视图和部分视图的强类型模型有什么不同吗?我刚刚开始研究所有这些,并且对此进行了0次经典培训,所以说实话,我甚至不知道强类型对于C和模型意味着什么。没问题!强类型视图意味着模型已绑定到它。如果视图是强类型的,您将在顶部看到一个类似于@model.Models.ViewModels.CreateTemplateModel的模型声明。另一方面,渲染局部对象时,您正在创建一个新模型。有什么东西使这个模型饱和了吗?回答第一部分。是的,这是一个强类型模型。我不知道饱和是什么意思。如果表示一个模型链接到两个页面,则表示“是”。为了保持原始页面的完整性,我删除了部分代码。该模型链接了两者,但它只是一个空模型,对吗?有什么东西可以填充它吗?所以我需要一个全新的单独控制器用于部分视图,而不是让partialview和regview都连接到同一个控制器?当然可以。根据某些逻辑流,您可以在同一控制器中渲染它们。但是,如果它们不返回相同的数据,则需要单独的返回,并且您不希望使用return View()返回部分视图。我确实返回了相同的数据。我希望我能理解后端在做什么,这样我就不会马上变成一个哑巴。我有一个public ActionResult Create(){attachSelectList(ViewBag);return View();}我知道这是在加载页面时自动调用的,或者我至少假设它是在加载/调用页面时调用的。如何使partialView不因selectlist对两者都具有受控工作而失败。我应该创建另一个方法,但是重载它,以便它传递一个值来区分这两个方法吗?partialView无法在控制器中创建。如果我转到从中删除它的页面,就可以使用此方法。你知道为什么会发生这种情况吗?如果你为局部视图创建一个新的控制器动作,它将永远不会命中create()。相反,它会影响新控制器的操作。在我的示例中,它将是TestPartialView()
public ActonResult TestPartialView()
@Html.RenderAction("TestPartialView").