Timothy Vandeweerd Ответов: 1

Asp.net MVC 3-выпадающий список из базы данных с selectedvalue


Я новичок в MVC и мне интересно, может ли кто-нибудь помочь?

У меня есть следующее, которое заполняет выпадающий список для каждой строки в модели, но не устанавливает выбранное значение (tblcusts.typeid) в выпадающем списке при заполнении страницы. Любая помощь будет очень признательна.

Что я уже пробовал:

Модели
public class tblcusts
{
   [Key]
   public int custid { get; set; }
   public int typeid { get; set; }
}

public class tblcusttypes
{
  [Key]
  public int typeid { get; set; }
  public string name { get; set; }
  public bool active { get; set; }
}

Смотреть
@Model IList<MvcApplication1.Models.tblcusts>
@for (var i = 0; i < Model.Count; ++i)
    {
       @Html.DropDownList("typeid", (IEnumerable<SelectListItem>)ViewBag.customertype)
       <br />
    }

Контроллер
var result = from m1 in db.custs select m1;

var query = from m2 in db.custtypes where m2.active == true orderby m2.name select m2.name;
var CustomerTypeList = new List<string>();
CustomerTypeList.AddRange(query.Distinct());
ViewBag.customertype = new SelectList(CustomerTypeList);

return View(result.ToList());

1 Ответов

Рейтинг:
0

David_Wimbley

Вы не получаете выбранное значение, потому что вы не устанавливаете какое-либо выбранное значение. Кроме того, ваш взгляд сбивает с толку, вы зацикливаетесь на выпадающем списке в вашем представлении, вы должны делать это в своей модели или контроллере (предпочтительно модели).... но я не думаю, что это должно показывать 1 тип выпадающего списка на каждого клиента? Во всяком случае...

Для установки выбранного значения списка вы должны сделать что-то подобное.

List<string> dropdown_content = new List<string>();
var query = from m2 in db.custtypes where m2.active == true orderby m2.name select m2.name;
SelectList list = new SelectList(query);

// This is where you find the selected item and if it isn't null, set Selected == true
var selectedItem = list.FirstOrDefault(m=>m.Value == id);

if(selectedItem != null)
{
   selectedItem.Selected = true;
}    

ViewBag.customertype = list;


Timothy Vandeweerd

Спасибо, Дэвид, я изменилась.:

от: ВАР элемент = список.Метода firstordefault(м =&ГТ; м. Значение == ИД);
к: ВАР элемент = список.FirstOrDefault(m1 =>m1. Value == typeid);

Ошибка выделяет присвоение "= = typeid); "и показывает:" имя 'typeid' не существует в текущем контексте"

Правильно ли я все понимаю? В моем представлении будут перечислены строки из tblcusts (m1), и каждая строка будет иметь выпадающий список, показывающий все строки из tblcusttypes (m2) с набором SelectedValue на основе значения строк tblcusts.typeid, которое может быть различным для каждой строки tblcusts.

David_Wimbley

Является typeid переменная? В вашем примере кода это строка. Не зная больше о вашем коде, похоже, что вам нужно зациклиться tblcusts это то, что ваше представление имеет в качестве своей модели, что для цикла в вашем представлении. Пройдите через это в своем классе модели, решите, есть ли там значение, и установите Selected = = true.

SelectList имеет следующие свойства. Текст, Значение, Выделено. Значение - это то, что сохраняется, текст-то, что отображается и выбирается, чтобы указать, было ли что-то выбрано.

Вам нужно будет сделать сравнение, чтобы сказать: "соответствует ли мое значение в списке выбора моему значению из базы данных, если это так- & gt; .Selected имеет значение true".

Timothy Vandeweerd

Дэвид,

Спасибо за ваш ответ. typeid-это столбец int в обеих таблицах. Это первичный ключ в tblcusttypes и внешний ключ в tblcusts. Мое представление будет отображать несколько строк при загрузке страницы, и для каждой строки в tblcusts я хотел бы иметь выпадающий список и значение SeclectedValue, которое будет установлено в значение внешнего ключа. Спасибо за ваше время, я искал и искал и, кажется, не могу найти пример этого в интернете.

Это мой код:

Модели

публичный класс tblcusts
{
[Ключ]
public int custid { get; set; }
public int typeid { get; set; }
}

публичный класс tblcusttypes
{
[Ключ]
public int typeid { get; set; }
public string name { get; set; }
public bool active { get; set; }
}

Смотреть

модель объекта IList&л@; mvcapplication1.модели.tblcusts&ГТ;
@for (var i = 0; i < Model.Граф; ++i)
{
@HTML-код.Dropdownlist для("ИД типа", (интерфейс IEnumerable&ЛТ;selectlistitem&ГТ;)ViewBag.пользовательский)
}

Контроллер

ВАР результат = с M1 в дБ.шлицы выберите М1;

ВАР запрос = с м2 в дБ.custtypes где M2.активный == правда заказатьпо м2.имя выбираете м2.название;
var CustomerType4= новый список & lt;string>();
CustomerType4.AddRange(запрос.Отчетливый());
ViewBag. customertype = новый список выбора (CustomerType4);

David_Wimbley

Эй Тимоти,

Похоже, что в вашем контроллере вам нужно зациклиться на ViewBag.customertype, чтобы установить, что выбрано. Я бы внес следующие изменения.

Вместо


ViewBag.customertype = new SelectList(CustomerType4);


Я бы изменил его на


var selectList = new SelectList(CustomerTyp4);
foreach(var item in selectList)
{
if(item.Value == typeid)
{
item.Selected = true;
}
}

Timothy Vandeweerd

Дэвид, спасибо, но теперь строка ниже выдает ошибку:

если (элемент.Значение == ИД типа)

Ошибка: имя "typeid" не существует в текущем контексте

Я очень ценю ваше время.

David_Wimbley

Никаких проблем, с удовольствием помогу.

Да, проблема в том, что typeId-это ваша переменная. Это то, что вы пытаетесь сказать, является вашим выбранным значением. У меня нет доступа ко всей вашей кодовой базе, а typeId-это то, что вы сказали: "typeid-это столбец int в обеих таблицах. "таким образом, у вас должно быть значение, которое должно быть помечено как выбранное где-то.

В вашем контроллере/действии у вас будет что-то вроде


public ActionResult(int id)
{
var typeId = id;
}


Где идентификатор, переданный в ваше действие, - это запись, которую вы пытаетесь отобразить на экране.

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

Надеюсь, это направит вас в правильном направлении

Timothy Vandeweerd

Дэвид, еще раз спасибо. Ниже приведен весь мой код. Идентификатор действия не передается. Когда страница загружается, она показывает список клиентов, и для каждой строки я хотел бы установить SelectedValue для каждого выпадающего списка строк. Источником строк является таблица tblcusts. Источником для каждого выпадающего списка строк является таблица tblcusttypes. Разве это невозможно?

Модели
------

публичный класс tblcusts
{
[Ключ]
public int custid { get; set; }
public int typeid { get; set; }
}

публичный класс tblcusttypes
{
[Ключ]
public int typeid { get; set; }
public string name { get; set; }
public bool active { get; set; }
}

Смотреть
----

Модель объекта IList&л@; mvcapplication1.модели.tblcusts&ГТ;
@for (var i = 0; i < Model.Граф; ++i)
{
@HTML-код.Dropdownlist для("ИД типа", (интерфейс IEnumerable&ЛТ;selectlistitem&ГТ;)ViewBag.пользовательский)

}

Контроллер
----------
ВАР результат = с M1 в дБ.шлицы выберите М1;

ВАР запрос = с м2 в дБ.custtypes где M2.активный == правда заказатьпо м2.имя выбираете м2.название;
var CustomerTypeList = новый список & lt;string>();
CustomerTypeList.AddRange(запрос.Отчетливый());
ViewBag. customertype = новый список выбора(CustomerTypeList);

return View(результат.Список());