我有一个页面,它有一个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);
}
这是一个漫长的一周,所以我可能会有点慢。
感谢您花时间看
答案 0 :(得分:0)
好的,现在我明白了你的意思。
嗯,问题是表单提交中的lisbox没有发送到服务器 - 只发送了选定的值。因此,在服务器上,您将找不到项目列表。
当用户按下提交时,您可以尝试选择列表框中的所有项目。
或者你可以:使用逗号列表保留一个隐藏的输入字段,用逗号分隔。然后,当您从列表框中删除时,您将从该字段中删除。在服务器上,您将获得该操作的字符串参数,并解析该操作。
<强> PS:强>
我尝试了第一个解决方案:
onclick='$("#remainingIds option").attr("selected","selected");'
在服务器上“ IList <int
&gt; remainingIds ”拥有所有项目。应该这样做。