2015-07-15 6 views
1

Теги можно выбирать по нескольким критериям и извлекать из базы данных.asp.net mvc ListBoxFor - MultiSelectList не применяет выбранный элемент

Это мое действие в контроллере:

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> 

Дело в том, что выбранный пункт не применяется! Элемент multi-select заполнен отлично, но нет выбора!

+0

Вот аналогичный вопрос, который может помочь вам: http://stackoverflow.com/questions/17021978/how-to-get-multiselected-dropdownlist-values-in-asp -net-mvc/17023462 # 17023462 – Evonet

ответ

1

Я изменил действие, и все в порядке. это мое действие в контроллере:

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); 
    } 
1

Вы пробовали прохождения 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" }) 
+0

Я проверил идентификатор вместо имени, но ничего не изменилось! – ConductedClever

+0

Хорошо, как насчет названия списка? Вы пытались изменить имя? –

+0

, но список заполняется корректно. имя для списка не только выбранных. – ConductedClever

Смежные вопросы