Выбранный пункт установки DropDownList в asp.net MVC

Я заметил то, что кажется мне ошибкой в asp.net MVC, или просто я делаю что-то не так. Я в настоящее время использую 1.0 поэтому, возможно, это - что-то, что будет обращено в этих 2,0 выпусках. Но так или иначе, здесь мы идем.

Когда я, моя модель представления имеет свойство, которое является тем же именем как заявленный идентификатор для выпадающего списка, выбранный пункт, проигнорирован, и представленному HTML ничего не выбрали. Не уверенный, если я сделал что-то не так, но менять имя идентификатора решает проблему. Я упростил пример, надежда, это ясно, иначе, сообщила мне.

Вот мое представление, где заявленный идентификатор является тем же именем как мой список в модели:

<table border="0" cellpadding="0" cellspacing="0">
   <tr>
      <td>
         <%= Html.DropDownList("IsMultipleServicers", Model.IsMultipleServicers) %>
      </td>
   </tr>
</table>

И представленный HTML

<table border="0" cellpadding="0" cellspacing="0">
      <tr>
         <td>
             <select id="IsMultipleServicers" name="IsMultipleServicers">
                <option value="false">No</option>
                <option value="true">Yes</option>
             </select>
         </td>
      </tr>
</table>

Теперь позволяет, делают небольшое изменение. Я изменю заявленный идентификатор, чтобы быть чем-то другим.

Вот мое Представление:

<table border="0" cellpadding="0" cellspacing="0">
    <tr>
       <td>
          <%= Html.DropDownList("MultipleServicers", Model.IsMultipleServicers) %>
       </td>
    </tr>
</table>

И теперь представленный HTML:

<table border="0" cellpadding="0" cellspacing="0">
   <tr>
      <td>
         <select id="IsMultipleServicers" name="IsMultipleServicers">
            <option value="false">No</option>
            <option selected="selected" value="true">Yes</option>
         </select>
      </td>
   </tr>
</table>

Заметьте, что теперь я получаю выбранную опцию, которая была бы вторым элементом в Списке.

Вот мой ViewModel только для связывания всего:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCProject.Models.ViewModels.Service
{
    public class ServiceViewModel : ViewModel
    {
         public List<SelectListItem> IsMultipleServicers { get; set; }
    }
}

Вот мое действие:

[AcceptVerbs(HttpVerbs.Get)]
public virtual ActionResult Service()
{
   return View(new ServiceViewModel()
   {
      IsMultipleServicers = BuildBooleanSelectList(true)
   };
}

 private List<SelectListItem> BuildBooleanSelectList(bool isTrue)
 {
    List<SelectListItem> list = new List<SelectListItem>();

    if (isTrue)
    {
       list.Add(new SelectListItem() { Selected = false, Text = "No", Value = "false" });
       list.Add(new SelectListItem() { Selected = true, Text = "Yes", Value = "true" });
    }
    else
    {
       list.Add(new SelectListItem() { Selected = true, Text = "No", Value = "false" });
       list.Add(new SelectListItem() { Selected = false, Text = "Yes", Value = "true" });
    }
 return list;
  }
26
задан Gabe 10 March 2010 в 00:01
поделиться

3 ответа

Я думаю, проблема заключается в путанице с перегрузками DropDownList :

  1. Html.DropDownList (имя строки) ищет свойство модели представления из , имя и тип IEnumerable . Он будет использовать выбранный элемент ( SelectListItem.Selected == true ) из списка, если не существует одноименного значения сообщения формы.

  2. Html.DropDownList (имя строки, IEnumerable selectList) использует элементы из selectList , но не их выбранные значения. Выбранное можно найти путем разрешения имени в модели представления (или данных публикации) и сопоставления его с SelectListItem.Value . Даже если значение не может быть найдено (или равно нулю), оно все равно не будет использовать выбранное значение из списка SelectListItems.

Ваш код использует вторую перегрузку, но указывает несуществующее свойство «значение» («MultipleServicers»).

Чтобы решить вашу проблему, либо используйте первую перегрузку:

<%= Html.DropDownList("IsMultipleServicers") %>

, либо добавьте свойство string MultipleServicers в свою модель представления и заполните его в своем контроллере.Я бы порекомендовал это решение, поскольку оно позволяет обойти несколько проблем с начальным отображением, отображением сообщений и сопоставлением данных публикации с моделью представления / публикации:

public class ServiceViewModel : ViewModel 
{ 
     public string MultipleServicers { get; set; } 
     public List<SelectListItem> IsMultipleServicers { get; set; } 
}

Затем для вашего HTML:

<%= Html.DropDownList(Model.MultipleServicers, Model.IsMultipleServicers) %>

Этот метод также отображается в MVC2:

<%= Html.DropDownListFor(x => x.MultipleServicers, Model.IsMultipleServicers) %>
44
ответ дан 28 November 2019 в 06:55
поделиться

Вспомогательная функция DropDownList извлекает значение по умолчанию из модели. В первом случае значение в модели, соответствующее имени, является SelectList - это не соответствует ни одному из элементов в списке, это список, поэтому значение не выбирается. Во втором примере ваша модель не включает свойство с таким именем, поэтому значение из модели нельзя использовать, и оно по умолчанию соответствует состоянию, указанному в самом списке SelectList. Обычно у меня будет свойство модели для выбранного значения - оно становится значением по умолчанию - и другое свойство, представляющее потенциальные значения для списка.

2
ответ дан 28 November 2019 в 06:55
поделиться

Я столкнулся с той же проблемой при использовании перегрузки Html.DropDownList (имя строки, IEnumerable selectList). Похоже, что у моей модели есть свойство с тем же именем, что и имя раскрывающегося списка. В этом случае MVC предпочел значение свойства моей модели свойству Selected каждой записи в IEnumerable.

Решением было использовать имя для раскрывающегося списка, которое не соответствует имени свойства. Другим решением было бы написать собственный метод расширения, который игнорирует состояние модели и представления и вместо этого всегда учитывает выбранное свойство.

9
ответ дан 28 November 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: