代码之家  ›  专栏  ›  技术社区  ›  David E

将VIEWDATA传递回控制器以与下拉列表一起使用

  •  1
  • David E  · 技术社区  · 15 年前

    我有一个页面有一个html.dropdownlist,它接受一个viewdata参数。问题是,当用户单击“保存”时,它会通过调用modelstate来验证模型。如果失败,我希望页面显示错误(这很好地工作)。

    我遇到的问题是下拉列表的viewdata丢失了,这意味着我不知道在验证错误之前列表框处于什么状态(有一个Ajax调用,允许从列表中添加和减去内容-虽然这在隔离状态下工作正常)

    编辑——正如下面讨论的回答:实际上,我需要返回整个列表框。不需要当前选定的值。基本上,这个列表包含了没有贴标签的作者。当用户添加作者时,javascript函数会将其从列表中删除,并将其添加到我可以跟踪的文本框中。我的问题是,我似乎无法恢复列表框的当前状态(我很感激请求完成后视图状态实际上会丢失)--结束编辑(希望这样更清楚)

    代码如下:

    编辑页面

      ${Html.DropDownList("AuthorsDropDown")} <input type="button" onClick="removeOptions(Authors)"; value='Add author to article' />
    

    论控制器的编辑动作

        public ActionResult Edit(Article form)
        {
           var articleList = articleMapper.MapForLists(form);
            var authorList = new AuthorRepository().FindAll();
            foreach (var author in articleList.Authors)
                authorList.Remove(author);
            ViewData["AuthorsDropDown"] = new SelectList(authorList, "Id", "GetFullName");
            return View("Edit", articleList);
        }
    

    关于保存动作

        [ValidateModel(typeof (ArticleDto)), AcceptVerbs(HttpVerbs.Post), ValidateInput(false)]
        public ActionResult Save(ArticleDto form)
        {
            return SaveContent(form, articleDto => RedirectToAction<NewsController>(c => c.Index(null)),PopulateIdentities);
        }
    

    这是一个漫长的星期,所以我可能只是有点慢。

    谢谢你花时间看

    1 回复  |  直到 15 年前
        1
  •  0
  •   sirrocco    15 年前

    好吧,现在我明白你想要什么了。

    好吧,问题是表单提交时的lisbox不会发送到服务器,只会发送选定的值。所以在服务器上找不到项目列表。

    当用户按“提交”时,可以尝试选择列表框中的所有项目。

    或者,您也可以:使用ID列表保留一个隐藏的输入字段,用逗号分隔。然后,从列表框中移除时,将从字段中移除。在服务器上,您将有一个操作的字符串参数,并对其进行分析。

    PS:

    我尝试了第一个解决方案:

    onclick='$("#remainingIds option").attr("selected","selected");'
    

    在服务器上” 伊利斯特 <int >剩余资源 “拥有所有物品。它应该会起作用。