Проблема ASP .NET MVC 3 DropDownListFor

В модели у меня есть:

public Guid? Country
{ get; set; }

В представлении у меня есть:

@Html.DropDownListFor(m => m.Country, (SelectList)ViewBag.Countries)

При отправке возникает ошибка, потому что она хочет сохранить строку в Guid. Как сохранить значение, а не текст выпадающего списка?


person Alex    schedule 08.08.2011    source источник
comment
В качестве обходного пути вы можете добавить свойство CountryString, которое упаковывает GUID, и настроить DropDownListFor для его использования, но должен быть лучший способ.   -  person Rup    schedule 08.08.2011
comment
Ok. Я немного изменил свой код, и вот что я использую в представлении: @Html.DropDownListFor(m => m.Country, new SelectList(ViewBag.Countries, ID_Country, ISO_Code), ); в основном, я только что переместил вызов конструктора SelectList() из контроллера в представление. И вот как я получаю страны в ViewBag из контроллера (через Entity Framework): ViewBag.Countries = from e в new FarmerEntities(). Country select e;. Теперь я получаю, что значение не может быть нулевым исключением (если я выберу что-то или нет). Пожалуйста помоги!   -  person Alex    schedule 08.08.2011
comment
Судя по всему, вы используете коды стран ISO (которые не являются GUID). Есть ли причина, по которой ваш тип данных для страны — это Guid, а не строка?   -  person Jared Peless    schedule 09.08.2011
comment
Нет. ID_Country предназначен для списка скрытых значений DropDownLists, а ISO_Code — для списка передних/видимых значений DropDownLists. Все работает нормально до отправки.   -  person Alex    schedule 09.08.2011


Ответы (1)


Ok. Получил работу с немного другим подходом.

Модель:

public UserRegistrationModel()
{
    this.InitializeCountries();
}

private void InitializeCountries()
{
    FarmerEntities fe = new FarmerEntities();
    var query = from c in new FarmerEntities().Countries select new { ID = c.ID_Country, Name = c.ISO_Code };
    var countries = query.ToSelectList(c => c.ID.ToString(), c => c.Name);

    this.Countries = countries;
}

public Guid? { get; set; }

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

Контроллер:

UserRegistrationModel model = new UserRegistrationModel();

return View(model);

Вид:

@Html.DropDownListFor(m => m.Country, Model.Countries, "")

Кроме того, вам необходимо реализовать это расширение

public static class EnumerableExtensions
{
    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);
    }

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

    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)
            };
        }
    }
}
person Alex    schedule 09.08.2011