ASP .Net MVC 3 Html.DropDown не привязан к переменной - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть список организаций (CalledOrganizationSelectList), и одна из них называется (CalledOrganizationId). Я установил оба в моей ViewModel, но MVC / Razor неправильно отображает выпадающий список (то есть не устанавливает атрибут selected = "selected" для правильного элемента в раскрывающемся списке).

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

public class CallViewModel{
public int? CalledOrganizationId { get; set; }        
public SelectList CalledOrganizationSelectList { get; set; }}

В моем контроллере:

var vm = new CallViewModel();
var calledOrganizationSelectList = new List<object>();
calledOrganizationSelectList.Add( new {Text="",Id=""});
calledOrganizationSelectList.AddRange(
db.MyOrganizations.OrderBy(x=>x.Name)
  .Select(x => new { Text = x.Name, Id =     x.Id.ToString()}).ToList());
var sl = new SelectList(calledOrganizationSelectList, "Id", "Text",
  vm.CalledOrganizationId);
vm.CalledOrganizationSelectList = sl;
return View(vm);

На мой взгляд:

<div>CalledOrganizationId = @Model.CalledOrganizationId : 
select list contains
<ul>@foreach (var itm in Model.CalledOrganizationSelectList)
  {<li>Value: @itm.Value Text: @itm.Text Is Selected: @itm.Selected</li>}
</ul>
</div>
@Html.DropDownList("CalledOrganizationId", Model.CalledOrganizationSelectList)

В моей отрендеренной странице источник:

<div>CalledOrganizationId = 38 : select list contains     
<ul>
<li>Value:  Text:  Is Selected: False</li>
<li>Value: 37 Text: rrr Is Selected: False</li>
<li>Value: 38 Text: sss1 Is Selected: True</li>
</ul>
</div>
<select data-val="true" data-val-number="The field CalledOrganizationId must be a number." id="CalledOrganizationId" name="CalledOrganizationId">
<option selected="selected" value=""></option> 
<option value="37">rrr</option> 
<option value="38">sss1</option> </select>

Я обошел эту проблему после того, как сначала вытащил то, что осталось от моих волос, а затем ввел новую переменную в мою ViewModel, которая, кажется, работает нормально.

1 Ответ

3 голосов
/ 02 апреля 2012

Наличие 2 свойств для вашей модели представления - это правильный способ создания DropDownLists. Одно свойство содержит все доступные параметры, а другое - текущий выбранный параметр:

public class CallViewModel
{
    // this captures the selected item
    public int? CalledOrganizationId { get; set; }

    // this contains the select list options     
    public IEnumerable<SelectListItem> CalledOrganizationSelectList { get; set; }
}

Однако вам не нужно добавлять пустую опцию в контроллер. Вы можете сделать это в виде:

@Html.DropDownListFor(m => m.CalledOrganizationId, 
    Model.CalledOrganizationSelectList, "")

Вы можете просто сойти с рук в контроллере:

var vm = new CallViewModel();
//var calledOrganizationSelectList = new List<object>();
//calledOrganizationSelectList.Add( new {Text="",Id=""});
//calledOrganizationSelectList.AddRange(
//db.MyOrganizations.OrderBy(x=>x.Name)
//  .Select(x => new { Text = x.Name, Id =     x.Id.ToString()}).ToList());
//var sl = new SelectList(calledOrganizationSelectList, "Id", "Text",
//  vm.CalledOrganizationId);
//vm.CalledOrganizationSelectList = sl;
vm.CalledOrganizationSelectList = db.MyOrganizations.OrderBy(x => x.Name)
    .Select(x => new SelectListItem 
    {
        Text = x.Name, 
        //Id = x.Id.ToString()  // do not use "Id" for the property name,
        Value = x.Id.ToString() // use "Value" -- it is a SelectListItem property
    });

// if you want to set the selected item on the dropdownlist, do it here
vm.CalledOrganizationId = 37;

return View(vm);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...