【问题标题】:MultiSelectList data binding and Model validation in MVCMVC 中的 MultiSelectList 数据绑定和模型验证
【发布时间】:2013-12-04 09:47:41
【问题描述】:

这是我在 MultiSelectList 中显示名称列表的代码

控制器

// GET
public ActionResult Create()
{
    var bookViewModel = new BookViewModel
    {
        AuthorList = _Authors.GetAuthors()
                          .Select(a => new SelectListItem { 
                                     Value = a.Id.ToString(), 
                                     Text = a.Name }
                                 ).ToList()
    };

    return View(bookViewModel);
}

// POST
[HttpPost]
public ActionResult Create(BookViewModel model)
{
    if (ModelState.IsValid)
    {
        //Some code
    }
    else
    {
        return View(model);
    }
}

查看

@using (Html.BeginForm())
{
    ...
    @Html.ListBoxFor(m => m.AuthorIds, Model.AuthorList, new { multiple = "multiple" })
    <input id="btnCreate" type="submit" value="Create" />
}

如果模型验证,此代码工作正常,但如果 ModelState.IsValid = false,当它将模型返回到视图 (.. else { return View(model); }) 时,模型不包含 AuthorList 并显示错误

没有“IEnumerable”类型的 ViewData 项 有键“AuthorIds”。

在视图行@Html.ListBoxFor(m =&gt; m.AuthorIds, Model.AuthorList....

知道如何解决这个问题吗?

【问题讨论】:

    标签: c# razor data-binding multi-select asp.net-mvc-5


    【解决方案1】:

    你需要在你的else部分再次初始化authorlist

    else
        {
    model.AuthorList = _Authors.GetAuthors()
                              .Select(a => new SelectListItem { 
                                         Value = a.Id.ToString(), 
                                         Text = a.Name }
                                     ).ToList()
            return View(model);
        }
    

    【讨论】:

    • 感谢您的回答,有没有办法保留以前的作者列表而不是从数据库中再次获取它?
    • 如果你的 if 工作正常,你必须为 AuthorList 赋值。所以在 if else 外面有变量,然后你可以使用相同的变量
    • @Nalaka526 记住网络是无状态的。 Get 和 Post 请求可能相隔 20 分钟。也就是说,如果作者列表在很多地方使用,您可以缓存它而不是去数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多