Путаница с DropDownListFor <> - PullRequest
       4

Путаница с DropDownListFor <>

0 голосов
/ 17 ноября 2010

Итак, я пытаюсь импортировать данные из базы данных в MVC2 DropDownListFor.

По сути, у меня есть сайт гильдии по ролевой игре, над которым я работаю для друга. Что страница должна делать, это позволяет человеку редактировать свой характер. Итак, на страницу передается модель, содержащая информацию о персонажах. Затем у меня есть представление вызова метода в модели YourCharacterEdit для получения информации о расе персонажа.

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

Контроллер:

 if (Request.IsAuthenticated)
            {

                UserRepository _urepos = new UserRepository();
                CharacterRepository _crepos = new CharacterRepository();
                var check = _urepos.GetSpecificUserByName(User.Identity.Name);
                var yourchar = _crepos.GetSpecificCharacter(CharID);

                if (yourchar.CharUserRef == check.UserID)
                {
                    //
                    YourCharacterEdit VarToReturn = new YourCharacterEdit();

                    VarToReturn.EmployeeID = yourchar.EmployeeID;
                    VarToReturn.CharFirstName = yourchar.CharFirstName;
                    VarToReturn.CharLastName = yourchar.CharLastName;
                    VarToReturn.CharGender = yourchar.CharGender;
                    VarToReturn.CharSpecies = yourchar.CharSpecies;
                    VarToReturn.CharDescription = yourchar.CharDescription;
                    VarToReturn.CharBackground = yourchar.CharBackground;
                    VarToReturn.CharJob = yourchar.CharJob;

                    return View("CharEdit", VarToReturn);
                }
                else
                {
                    return View("401");
                }


            }

Вид:

<div class="editor-field">
                <%: Html.DropDownListFor(model => model.CharSpecies, ?)%>
                <%: Html.ValidationMessageFor(model => model.CharSpecies) %>
            </div>

Так есть ли у кого-нибудь хорошие методы для распространения ListBox?

Также к БД есть доступ через guildEntities. Стол ТБЛЧарС. Поля, необходимые внутри этой таблицы: CharS_id и CharS_name.

1 Ответ

1 голос
/ 17 ноября 2010

Первое, что нужно сделать, это определить вашу модель.Представление не должно нуждаться в каких-либо дополнительных данных, кроме тех, которые вы передаете в модели.Создайте свою модель и заполните ее перед вызовом представления.

Моя реализация немного излишня, но здесь все идет так:

В модели создайте контейнер для хранения раскрывающихся данных:

public IEnumerable<SelectListItem> LocationList { get; set; }

В контроллере заполните вашу модель, включая раскрывающийся список:

model.LocationList = repository.GetLocationsSelectList(selectedLocationId);

Я использую репозиторий и Linq для получения данных из базы данных:

        var q = (from l in Repository.For<LocationEntity>()
                 select new
                 {
                     RowId = l.RowId,
                     LocationString = l.Name,
                 });

        var result = q.ToSelectList(a => a.RowId.ToString(), a => a.LocationString, a => a.RowId == locationId);

        return result;

Расширение ToSelectList, которое я взял откуда-то (я забыл где):

public static class EnumerableExtensions
{
    /// <summary>
    /// Converts the source sequence into an IEnumerable of SelectListItem
    /// </summary>
    /// <param name="items">Source sequence</param>
    /// <param name="nameSelector">Lambda that specifies the name for the SelectList items</param>
    /// <param name="valueSelector">Lambda that specifies the value for the SelectList items</param>
    /// <returns>IEnumerable of SelectListItem</returns>
    public static IEnumerable<SelectListItem> ToSelectList<TItem, TValue>(this IEnumerable<TItem> items, Func<TItem, TValue> valueSelector, Func<TItem, string> nameSelector)
    {
        return items.ToSelectList(valueSelector, nameSelector, x => false);
    }

    /// <summary>
    /// Converts the source sequence into an IEnumerable of SelectListItem
    /// </summary>
    /// <param name="items">Source sequence</param>
    /// <param name="nameSelector">Lambda that specifies the name for the SelectList items</param>
    /// <param name="valueSelector">Lambda that specifies the value for the SelectList items</param>
    /// <param name="selectedItems">Those items that should be selected</param>
    /// <returns>IEnumerable of SelectListItem</returns>
    public static IEnumerable<SelectListItem> ToSelectList<TItem, TValue>(this IEnumerable<TItem> items, Func<TItem, TValue> valueSelector, Func<TItem, string> nameSelector, IEnumerable<TValue> selectedItems) 
    {
        return items.ToSelectList(valueSelector, nameSelector, x => selectedItems != null && selectedItems.Contains(valueSelector(x)));
    }

    /// <summary>
    /// Converts the source sequence into an IEnumerable of SelectListItem
    /// </summary>
    /// <param name="items">Source sequence</param>
    /// <param name="nameSelector">Lambda that specifies the name for the SelectList items</param>
    /// <param name="valueSelector">Lambda that specifies the value for the SelectList items</param>
    /// <param name="selectedValueSelector">Lambda that specifies whether the item should be selected</param>
    /// <returns>IEnumerable of SelectListItem</returns>
    public static IEnumerable<SelectListItem> ToSelectList<TItem, TValue>(this IEnumerable<TItem> items, Func<TItem, TValue> valueSelector, Func<TItem, string> nameSelector, Func<TItem, bool> selectedValueSelector) 
    {
        foreach (var item in items) 
        {
            var value = valueSelector(item);

            yield return new SelectListItem
            {
                Text = nameSelector(item),
                Value = value.ToString(),
                Selected = selectedValueSelector(item)
            };
        }
    }
}

И, наконец, на ваш взгляд:

<%: Html.LabelFor(m => m.LocationId)%>
<%: Html.DropDownListFor(m => m.LocationId, Model.LocationList, "<-- Select One -->")%>
<%: Html.ValidationMessageFor(m => m.LocationId)%>

Добавьте комментарий, если у вас есть какие-либо вопросы или вам нужно большекод.

...