0
我有一個問題

在我的PartialView DropDownListFor獲得誤差:@ Html.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" }) 

這個錯誤不會彈出當我去到頁面原本持有這個代碼。我所做的是去除了之前與另一個partialView一起工作的代碼的核心部分,只要我拿出代碼中的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; } 
} 

有一個控制器,它很長,所以我不打算張貼。如果控制器的某些部分對我有幫助,我可以發佈這些部分以及任何其他我可能已經忘記的東西,包括

+0

對於視圖和局部視圖,強類型模型是否有區別? –

+0

我剛開始在所有這些工作,並有0經典的訓練,所以說實話,我甚至不知道什麼強類型的手段參考C#和模型。 – Rob

+1

沒問題!一個強類型的視圖意味着一個模型綁定它。如果您的視圖是強類型的,您會在頂部看到一個類似於@model MAO.Models.ViewModels.CreateTemplateModel的模型聲明。另外,當你渲染你的部分時,你正在創建一個新模型。是否有任何東西飽和該模型? –

回答

2

根據您的意見,我懷疑您永遠不會重新排列您的下拉列表列表,當你返回你的局部視圖。您對該部分的控制器操作應該以與呈現全視圖的控制器操作相同的方式構建您的下拉列表。比較兩者並確保它們匹配。

UPDATE:你的部分觀點行動看起來應該像下面這樣:

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。

+0

所以我需要一個全新的單獨的控制器的局部視圖,並沒有partialview和regview連接到相同的控制器? – Rob

+1

你當然可以。您可以根據邏輯流程在同一個控制器中渲染它們。但是,如果它們沒有返回相同的數據,則它們需要單獨的返回,並且您不希望使用返回View()返回部分視圖。 –

+0

我確實有相同的數據被返回。我希望我能夠理解後端在幹什麼,這樣我就不會像現在一樣傻了。我有一個公共的ActionResult創建(){attachSelectList(ViewBag); return View();}這個我知道是在頁面加載的時候自動調用的,或者我至少假設它在頁面加載/調用時被調用。我將如何獲得partialView不會因選擇列表的控制工作而失敗。我應該創建另一個方法,但是重載它,以便它傳遞一個值來區分兩者? – Rob