#c# #asp.net-mvc #asp.net-mvc-3 #drop-down-menu
#c# #asp.net-mvc #asp.net-mvc-3 #выпадающее меню
Вопрос:
Я использую C # в ASP MVC3. У меня есть две таблицы с SQL Server.Имена таблиц SMS_User
и SMS_Division
в SQL Server 2008. Когда я создаю нового пользователя, я хочу показать идентификатор подразделения из таблицы sms_division.
SMS_User
содержит UserName
, DivisionID
, EmailAddress
SMS_Division
содержит DivisionID
, DivisionName
.
Код контроллера :
UserController : Controller
{
private NetPerfMonEntities2 db = new NetPerfMonEntities2();
IEnumerableZamZam= db.SMS_Division.Select(c => new SelectListItem { Value = c.divisionid.ToString(), Text = c.divisionid.ToString() } );
}
Когда я создаю нового пользователя в представлении User Create (), я хочу показать имя подразделения в виде выпадающего списка вместо текстового поля. Как я это делаю?
@Html.DropDownListFor(model => model.divisionid, (IEnumerable<SelectListItem>) ViewData["Divisions"], "<--Select a divison-->")
@Html.ValidationMessageFor(model => model.divisionid)
У меня есть это сообщение об ошибке :
CS0103: The name 'sms_amountlimit2' does not exist in the current context
Комментарии:
1. Пользовательский контроллер: частные NetPerfMonEntities1 db = новые NetPerfMonEntities1(); IEnumerable<SelectListItem>Подразделения= db.SMS_Division. Выберите(c => new SelectListItem { Значение = c.divisionid. toString(), Text = c.имя подразделения. toString() } ); { ViewData[«Подразделения»] = подразделения; } } }
Ответ №1:
Я предполагаю, что в моем ответе будет несколько недостающих частей вашего вопроса, и дам вам общий шаблон для создания рабочего выпадающего списка ASP.NET MVC 3 :
Давайте начнем с моделей :
UserModel будет классом, представляющим данные, извлеченные из sms_user
public class UserModel
{
public string Username { get; set; }
public string EmailAddress { get; set; }
public int DivisionId { get; set; }
}
DivisionModel будет классом, представляющим данные, извлеченные из sms_division
public class DivisionModel
{
public int DivisionId { get; set; }
public string DivisionName { get; set; }
}
Под извлеченным я подразумеваю все, что может преобразовать данные в вашей базе данных в экземплярах классов. Это может быть ORM (EntityFramework или другие) Или SQL-запросы и т. Д…
Далее идет viewmodel, потому что не имеет смысла подключать IEnumerable делений в UserModel, и мне лично не очень нравится использовать ViewData, когда я могу этого избежать :
public class UserViewModel
{
public UserModel User { get; set; }
public IEnumerable<DivisionModel> Divisions {get; set;}
}
Далее, контроллер :
public class UserController : Controller
{
public ActionResult Create()
{
List<DivisionModel> divisions = new List<DivisionModel>();
divisions.Add(new DivisionModel() { DivisionId = 1, DivisionName = "Division1" });
divisions.Add(new DivisionModel() { DivisionId = 2, DivisionName = "Division2" });
UserModel user = new UserModel() { Username = "testUser", EmailAddress = "testAddress@test.com" };
return View(new UserViewModel() { User = user, Divisions = divisions });
}
}
Я просто создаю список разделов и пользователя, но затем вы получите его из своей базы данных любым используемым вами способом.
И, наконец, представление :
@model ViewModels.UserViewModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<p>
@Html.DropDownListFor(model => model.User.DivisionId, new SelectList(Model.Divisions, "DivisionId", "DivisionName"), "-- Select Division --")
@Html.ValidationMessageFor(model => model.User.DivisionId)
</p>
Обратите внимание, что модель, привязанная к представлению, является ViewModel .
Ответ №2:
В вашей модели добавьте коллекцию подразделений, затем создайте выпадающий список, как показано ниже:
@Html.DropDownListFor(m => m.SelectedDivisionId,
new SelectList(Model.Divisions, "DivisionId", "DivisionName"),
"-- Select Division --")
Комментарии:
1. Сообщение об ошибке: Сообщение об ошибке компилятора: CS1061: ‘AFESignatureApplication. Модели. SMS_AmountLimit2’ не содержит определения для ‘Divisions’ и никакого метода расширения ‘Divisions’, принимающего первый аргумент типа ‘AFESignatureApplication. Модели. Может быть найден SMS_AmountLimit2’ (вам не хватает директивы using или ссылки на сборку?) Код для контроллера:
2. частные NetPerfMonEntities2 db = новые NetPerfMonEntities2(); IEnumerable<SelectListItem>Подразделения= db.SMS_Division. Выберите(c => new SelectListItem { Значение = c.divisionid. toString(), Text = c.имя подразделения. toString() } ); { ViewData[«Подразделения»] = подразделения; }
3. @SyedSami пожалуйста, отредактируйте свой пост и поместите код в блок кода, он нечитаем в комментариях здесь.
4. у вас есть адрес электронной почты? так что я могу отправить вам файл по почте. Спасибо