2012-03-23 6 views
13

Еще один из этих вопросов относительно DropDownListFor не выбирает «Выбранные» значение. Вот код:DropDownListFor - не выбирает значение «Selected»

Модель:

public class CreateEditAccountModel 
{ 
    [Required] 
    [Display(Name = "Permission")] 
    public int PermissionId { get; set; } 
    public IEnumerable<SelectListItem> Permissions { get; set; } 
} 

Контроллер:

[HttpGet] 
[Authorize] 
public ActionResult EditAccount(int id) 
{ 
    CreateEditAccountModel model = new CreateEditAccountModel(); 
    model.Permissions = PermissionsAll(); 
    return View("CreateEditAccount", model); 
} 

На данный момент, если я поставил точку останова на возвратной линии, model.Permissions содержит правильную IEnumerable<SelectListItem> объекта с несколькими элементами и только один, который имеет Selected = true.

Вид:

@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.PermissionId, Model.Permissions) 
} 

Визуализирует:

<select id="PermissionId" name="PermissionId"> 
    <option value="">-- Select --</option> 
    <option value="1">Permission one</option> 
    <option value="2">Permission two</option> 
</select> 

По какой-то причине не выбран атрибут на любой из вариантов и первый вариант выбран.

Любая помощь приветствуется.


UPDATE

Оказывается, у него есть что-то делать с этим article. Чтобы обобщить решение этой статьи, мне нужно убедиться, что имя свойства (первый аргумент @html.DropDownList) не соответствует любым существующим свойствам модели. Может ли кто-нибудь объяснить, почему это так?

Это делает выпадающий правильно, когда я пишу в вид что-то вроде этого:

@Html.DropDownList("PermissionIdNotMatching", Model.Permissions) 

Однако это не делает никакого логического смысла делать это, так как я на самом деле хочу связующее, чтобы иметь возможность соответствовать имя элемента select для свойства модели. В противном случае мне придется вручную взять значение следующим образом: Request.Form["PermissionIdNotMatching"];

У кого-нибудь есть мысли?


РЕШЕНИЕ

См принял ответ и первый комментарий к ней.

+1

Значение PermissionId должно быть равно SelectListItem.Value, для которого Selected = true. Попробуйте model.PermissionId = Convert.ToInt32 (lst.First (t => t.Selected) .Value); Я также столкнулся с такой же проблемой, как и вы, удивительно, что значение выбиралось при редактировании, откуда я понял, что PermissionId должен иметь то же значение, что и для выбранного значения SelectListItem. Работал для меня. – Brij

ответ

8

Хорошо, давайте обсудим ваш пример, когда PermissionId был int. Вы опубликовали модель типа CreateEditAccountModel для просмотра. Когда вы создали эту модель, PermissionId равно 0 (значение по умолчанию для int). И DropDownListFor в поле зрения получите это значение. Поэтому у вас не было выбранных значений. Когда вы использовали тип строки, значение по умолчанию PermissionId было null, поэтому `DropDownListFor приняло значение по умолчанию для SelectList.

В этом случае лучше использовать int? или Nullable<int> тип для PermissionId.

+1

ваше объяснение имеет отношение. Вернувшись назад, когда я задал этот вопрос, я не понял, что 'DropDownListFor' сначала оценит значение' PermissionId', и если он не является нулевым, он сделает это значение выбранным. В противном случае это учитывало бы «Model.Permissions» – Dmitry

+0

Это может быть и не связано с вопросом, но может быть полезно кому-то, если вы, например, создадите List из linq для объектов и преобразуете Int в строку Value make обязательно обрезать, если вы используете SqlFunctions.StringConvert, потому что он не будет отображать selected = true для предварительно выбранного значения. Не обрезка приводит к тому, что выпадающее меню имеет такие значения: value = "1". –

4

При использовании @Html.DropDownListFor(m => m.PermissionId, Model.Permissions), пожалуйста, убедитесь, что PermissionId уже установлен в вашей модели - , который выбранный элемент/идентификатор.Кроме того, модель содержит 'выбранный атрибут':

var query = DatabaseContexts.Select(
      c => new SelectListItem 
      { 
       Value = c.Key, 
       Text = c.Value, 
       Selected = c.Key == currentUsed 
      }); 

PermissionId = that want to select; 
Permissions = query.AsEnumerable(); 

UPDATE:

здесь полный образец HttpGet:

В HomeController.cs:

[HttpGet] 
public ActionResult EditAccount(int id) 
{ 
    CreateEditAccountModel model = new CreateEditAccountModel(); 

    var permissionsAll = new List<SelectListItem> 
     { 
      new SelectListItem 
       { 
        Value = "", 
        Text = "--please select--", 
        Selected = false 
       }, 
      new SelectListItem 
       { 
        Value = "1", 
        Text = "Permission one", 
        Selected = true 
       }, 
      new SelectListItem 
       { 
        Value = "2", 
        Text = "Permission two", 
        Selected = false 
       } 
     }; 
    model.PermissionId = 1; //add this line 
    model.Permissions = permissionsAll; // PermissionsAll();// -- get data from services or anywhere.... 
    return View("EditAccount", model); 
} 

CreateEditAccountModel.cs:

public class CreateEditAccountModel 
{ 
    [Required] 
    [Display(Name = "Permission")] 
    public int PermissionId { get; set; } 
    public IEnumerable<SelectListItem> Permissions { get; set; } 

} 

EditAccount.cshtml:

@using MvcApplication1.Models 
@model CreateEditAccountModel 
@{ 
    ViewBag.Title = "EditAccount"; 
} 

<h2>EditAccount</h2> 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.PermissionId, Model.Permissions) 
} 

Запустите приложение и перейдите в/главная/editaccount/1, раскрывающийся отберет "Разрешение один" по умолчанию.

Я думаю, что PermissionId должен быть тип «строка» является, System.Web.Mvc.SelectedListItem.Value это «строка»

Если вы хотите сделать что-то, когда пользователь выбрал пункт в списке, вы может потребоваться [HttpPost].

BTW: this link Вам подходит?

+0

PermissionId был фактически установлен. Я изначально скопировал неправильный набор свойств из модели. Пожалуйста, просмотрите еще раз. – Dmitry

+0

в контроллере: CreateEditAccountModel model = new CreateEditAccountModel(); model.Permissions = PermissionsAll(); модель.PermissionId = 1;/* selected id */ return View («CreateEditAccount», модель); in view: @ Html.DropDownListFor (m => m.PermissionId, Model.Permissions); – xoyoja

+0

xoyoja, почему бы вам присвоить ему значение на HttpGet? В любом случае значение переменной не должно влиять на раскрывающийся список, поскольку это просто переменная, которая будет удерживать выбранное значение. Я все еще пробовал, и это не помогло. Спасибо за попытку! – Dmitry

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