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

时间:2009-07-04 16:41:21

标签: c# asp.net-mvc drop-down-menu viewstate

我有一个页面,它有一个Html.DropDownList,它接受一个viewdata参数。问题是,当用户单击“保存”时,它会通过调用ModelState.IsValid验证模型,如果此操作失败,我希望页面显示错误(这样可以正常工作)

我遇到的问题是DropDown的viewdata丢失,这意味着在验证错误之前我不知道列表框处于什么状态(有一个允许添加和减去事物的ajax调用从列表中 - agin这个工作正常孤立)

编辑 - 正如下面在回答答案中所讨论的:实际上我需要整个列表框。不需要当前选择的值。基本上,该列表包含未标记到文章的作者。当用户添加作者时,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 个答案:

答案 0 :(得分:0)

好的,现在我明白了你的意思。

嗯,问题是表单提交中的lisbox没有发送到服务器 - 只发送了选定的值。因此,在服务器上,您将找不到项目列表。

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

或者你可以:使用逗号列表保留一个隐藏的输入字段,用逗号分隔。然后,当您从列表框中删除时,您将从该字段中删除。在服务器上,您将获得该操作的字符串参数,并解析该操作。

<强> PS:

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

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

在服务器上“ IList <int&gt; remainingIds ”拥有所有项目。应该这样做。