首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有“ViewData”类型的“IEnumerable<SelectListItem>”项具有“RouterElect”键

没有“ViewData”类型的“IEnumerable<SelectListItem>”项具有“RouterElect”键
EN

Stack Overflow用户
提问于 2016-01-21 16:59:24
回答 1查看 97关注 0票数 0

这个问题以前曾被问过类似的问题,但我不知道如何将这些答案应用于我的具体问题:

ViewModel

代码语言:javascript
复制
   public string RouterElect { get; set; }

视图

代码语言:javascript
复制
    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>
    }

局部视图

代码语言:javascript
复制
    @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>

当页面加载时,它将无问题地呈现,如下所示:

从呈现页中平铺

但是,当选择下拉列表中的项,然后单击OKay按钮时,会发生以下错误:

没有具有'RouterElect‘键的'IEnumerable’类型的IEnumerable项。

对于代码行:

代码语言:javascript
复制
@Html.DropDownListFor(x => x.RouterElect, Model.JPortalChamberUsersAsItems, new { @id = "changeCurrentRouterInput", @class = "m-wrap", @onchange = "" })

任何想法都很感激。

更新:有人询问JPortalChamberUsersAsItems后端代码:

代码语言:javascript
复制
    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);
    }

另一个问题是关于OKay的行动。它调用changeCurrentRouter脚本,该脚本执行ChangeCurrrentRouter操作:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2016-01-21 18:14:23

当您单击OK按钮时,我不确定您在做什么。我假设它向操作方法提交了一个表单,并且您将在某些usecase上再次将已发布的模型返回到视图(可能是在模型验证失败时吗?)。每当您将对象返回到视图时,都需要确保再次加载JPortalChanerUsersAsItems集合属性。因为Http是无状态的,并且它不会在多个请求之间持久化该属性的值。

代码语言:javascript
复制
[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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34929791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档