asp.net mvc ListBoxFor - MultiSelectList 不应用所选项目

asp.net mvc ListBoxFor - MultiSelectList does not apply the selected item

标签是多重的select并且可以从数据库中检索。

这是我在控制器中的操作:

public ActionResult EditDocument(long documentId, string returnURL)
    {
        ViewBag.returnURL = returnURL;

        int userId = AccountController.GetLoggedInId(Session);
        string pageUrl = "Document/EditDocument";

        if (IsDocumentAccessible(documentId,pageUrl) && CheckOperation("EditDocument",pageUrl))
        {
            try
            {

                spGetDocumentById_Result found = db.spGetDocumentById(documentId).ToArray()[0];

                EditDocumentViewModel model = new EditDocumentViewModel()
                {
                    DocumentId = found.DocumentId,
                    DocumentNumber = found.DocumentNumber,
                    DocumentDate = found.DocumentDate,
                    DocumentLevelType = (int)found.DocumentLevelTypeId,
                    AddressSrc = found.Address
                };

                List<spGetTagsOfDocument_Result> tags = db.spGetTagsOfDocument(documentId).ToList();

                foreach (spGetTagsOfDocument_Result tag in tags)
                {
                    model.selectedTags.Add(tag.TagName);
                }

                List<spGetAllDocumentLevelType_Result> DocumentLevelTypeList = db.spGetAllDocumentLevelType(userId, pageUrl).ToList();
                ViewBag.DocumentLevelTypeId = new SelectList(DocumentLevelTypeList, "DocumentLevelTypeId", "DocumentLevelTypeName");

                List<spGetAllTags_Result> TagList = db.spGetAllTags(AccountController.GetLoggedInId(Session), "Document/AddDocument").ToList();
                ViewBag.tags = new MultiSelectList(TagList, "TagId", "TagName", model.selectedTags.ToArray());

                return View(model);
            }
            catch (Exception)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
        }

        return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
    }

和视图:

<div class="form-group">
                            @Html.LabelFor(model => model.tags, new { @class = "col-sm-3 control-label" })
                            <div class="col-sm-8">
                                @Html.ListBoxFor(model => model.tags, ViewBag.tags as MultiSelectList, new { @class = "form-control" })
                            </div>
                        </div>

问题是 selected 项目不适用! multi-select元素填充得很好但是没有preselection!

您是否尝试过为所选标签传递 ID 而不是名称:

foreach (spGetTagsOfDocument_Result tag in tags)
{
    model.selectedTags.Add(tag.TagId);
}

也可能是ListBox的名称与MultiselectList的名称相同,您可以尝试更改您传递的标签列表的名称:

 ViewBag.tagList = new MultiSelectList(TagList, "TagId", "TagName", model.selectedTags.ToArray());

并传递该列表:

@Html.ListBoxFor(model => model.tags, ViewBag.tagList as MultiSelectList, new { @class = "form-control" })

我改变了动作,一切正常。 这是我在控制器中的操作:

public ActionResult EditDocument(long documentId, string returnURL)
    {
        ViewBag.returnURL = returnURL;

        int userId = AccountController.GetLoggedInId(Session);
        string pageUrl = "Document/EditDocument";

        if (IsDocumentAccessible(documentId, pageUrl) && CheckOperation("EditDocument", pageUrl))
        {
            try
            {

                spGetDocumentById_Result found = db.spGetDocumentById(documentId).ToArray()[0];

                EditDocumentViewModel model = new EditDocumentViewModel()
                {
                    DocumentId = found.DocumentId,
                    DocumentNumber = found.DocumentNumber,
                    DocumentDate = found.DocumentDate,
                    DocumentLevelType = (int)found.DocumentLevelTypeId,
                    AddressSrc = found.Address
                };

                List<spGetTagsOfDocument_Result> tags = db.spGetTagsOfDocument(documentId).ToList();

                //foreach (spGetTagsOfDocument_Result tag in tags)
                //{
                //    model.selectedTags.Add(tag.TagName);
                //}

                List<spGetAllDocumentLevelType_Result> DocumentLevelTypeList = db.spGetAllDocumentLevelType(userId, pageUrl).ToList();
                ViewBag.DocumentLevelTypeId = new SelectList(DocumentLevelTypeList, "DocumentLevelTypeId", "DocumentLevelTypeName", model.DocumentLevelType);

                List<spGetAllTags_Result> TagList = db.spGetAllTags(AccountController.GetLoggedInId(Session), "Document/AddDocument").ToList();
                //List<spGetAllTags_Result> selectedTags = TagList.Where(x => tags.Any(y => y.TagId == x.TagId)).ToList();

                IEnumerable<SelectListItem> items = from tag in TagList

                                                    select new SelectListItem

                                                    {

                                                        Text = tag.TagName.ToString(),

                                                        Value = tag.TagId.ToString(),

                                                        Selected = tags.Any(y => y.TagId == tag.TagId),

                                                    };
                //ViewBag.tags = new MultiSelectList(TagList, "TagId", "TagName", model.selectedTags.ToArray());
                ViewBag.tags = items;

                return View(model);
            }
            catch (Exception)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
        }

        return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
    }