2016-01-21 35 views
0

此問題已被要求提供類似問題,但我不知道如何將這些答案應用於我的特定問題:沒有類型爲'IEnumerable <SelectListItem>'的ViewData項目的密鑰'RouterElect'

視圖模型

public string RouterElect { get; set; } 

查看

if ((!string.IsNullOrWhiteSpace(Model.JudgeCode)) && (Model.userIsAuthorized)) 
    { 
     <div id="ChangeRouterSection" class="live-tile" data-mode="carousel" data-direction="vertical" data-delay="7000"> 
      @{Html.RenderPartial("_ChangeCurrentRouter");} 
     </div> 
    } 
    else 
    { 
     <div id="ChangeRouterSection" class="live-tile" data-mode="carousel" data-direction="vertical" data-delay="7000"> 
      <div class="tile"> 
       User not authorized. Access denied. 
      </div> 
     </div> 
    } 

局部視圖

@model JudicialPortal.ViewModels.PortalIndexView 

    <div class="tile"> 
     Change Current Router 
     @Html.DropDownListFor(x => x.RouterElect, Model.JPortalChamberUsersAsItems, new { @id = "changeCurrentRouterInput", @class = "m-wrap", @onchange = "" }) 
     <button type="button" class="m-btn green-stripe" onclick="changeCurrentRouter();" 
     style="color: #444; text-decoration: none;"> 
     Okay</button> 
    </div> 

當它呈現沒有問題,在頁面加載看起來像這樣:

Tile From rendered page

然而,當選擇從下拉列表中選擇項目,然後奧凱按鈕被點擊發生以下錯誤:

沒有具有'RouterElect'鍵的'IEnumerable'類型的ViewData項目。

對於代碼行:

@Html.DropDownListFor(x => x.RouterElect, Model.JPortalChamberUsersAsItems, new { @id = "changeCurrentRouterInput", @class = "m-wrap", @onchange = "" }) 

任何想法讚賞。

更新: 有人問起JPortalChamberUsersAsItems後端代碼:

JPortalChamberUsersAsItems = new List<SelectListItem>(); 

    if (HttpContext.Current.Session["JPortalChamberUsersAsItems"] != null) 
    { 
     JPortalChamberUsersAsItems = HttpContext.Current.Session["JPortalChamberUsersAsItems"] as List<SelectListItem>; 
    } 
    else 
    { 
     for (int i = 0; i < tempArrayOfUsers.Count; i++) 
     { 
      JPortalChamberUsersAsItems.Add(new SelectListItem { Text = tempArrayOfUsers[i], Value = tempArrayOfUsers[i] }); 
     } 

     foreach (SelectListItem routerUser in JPortalChamberUsersAsItems) 
     { 
      if (!string.IsNullOrWhiteSpace(routerUser.Text)) 
      { 
       if (routerUser.Text.ToUpper() != "PLEASE SELECT A ROUTER") 
       { 
        routerUser.Text = ReplaceUsernameWithFullName(routerUser.Text); 
       } 
      } 
     } 

     JPortalChamberUsersAsItems.Insert(0, (new SelectListItem { Text = "Please select a router", Value = "Please select a router" })); //2014-12-15 This code adds the "default" first option - DO NOT REMOVE 

     HttpContext.Current.Session.Add("JPortalChamberUsersAsItems", JPortalChamberUsersAsItems); 
    } 

另一個問題是問奧凱行動。它調用changeCurrentRouter腳本,該腳本執行ChangeCurrrentRouter行動:

public ActionResult ChangeCurrentRouter(string changeCurrentRouterInput, string JudgeCode, bool userIsAuthorized, PortalIndexView viewmodel) 
{ 
    bool databaseCallOk = false; 
    string errorString = ""; 
    viewmodel.userIsAuthorized = userIsAuthorized; 
    viewmodel.JudgeCode = JudgeCode; 

    if (!string.IsNullOrWhiteSpace(changeCurrentRouterInput)) 
    { 
     if (changeCurrentRouterInput.ToUpper() != "PLEASE SELECT A ROUTER") 
     { 
      //database call 
      databaseCallOk = viewmodel.changeRouterUser(changeCurrentRouterInput, JudgeCode); 
     } 
    } 

    if (databaseCallOk == false) 
    { 
     if (string.IsNullOrWhiteSpace(viewmodel.errorCatcher)) 
     { 

      errorString = "An error occurred trying to change the router for your chambers. Please confirm your selection and try again."; 
      viewmodel.errorCatcher = errorString; 
     } 
    } 

    viewmodel.justAttemptedRoutingChange = true; 

    return PartialView("~/Views/Shared/_ChangeCurrentRouter.cshtml", viewmodel); 
} 
+0

Model.JPortalChamberUsersAsItems的後端代碼是什麼? –

+0

單擊「確定」按鈕時會發生什麼?它是否提交表單?採取哪種行動方法?你能分享行動方法的代碼嗎? – Shyju

回答

0

我不知道,當您單擊確定按鈕,你在做什麼。我假設它將一個表單提交給一個操作方法,並且您將某個用例返回給視圖(可能是在Model驗證失敗時)。無論何時您將對象返回到您的視圖中,都需要確保您再次(重新)加載JPortalChanerUsersAsItems集合屬性。因爲Http是無狀態的,並且它不會在多個請求之間保留該屬性的值。

[HttpPost] 
public ActionResult SomeAction(PortalIndexView model) 
{ 
    if(ModelState.IsValid) 
    { 
     // to do : Save and redirect 
    } 
    // Reload the collection. 
    // I hard coded 2 items here. But you may get it from db and use it 
    model.JPortalChamberUsersAsItems = new List<SelectListItem> { 
    new SelectListItem { Value="1", Text="Detroit" } , 
    new SelectListItem { Value="2", Text="Ann Arbor" } 
    }; 
    return View(model); 

} 
+0

我想要注意的一件事是代碼在頁面呈現時首次執行w/out錯誤。但是,當這發生View(Index.cshtml)及其部分視圖(_ChangeCurrentRouter.cshtml)。單擊Okay按鈕時會出現錯誤,在這種情況下,您的操作方法中只能看到CallStack – crmauch

+0

中的PartialView(_ChangeCurrentRouter.cshtml),並查看您的模型的任何屬性是否爲null。 – Shyju

+0

在操作方法中,沒有空值。我猜這個方法之後的渲染是錯誤發生的地方? – crmauch

相關問題