Также помните, что при генерации AppID, если вы хотите, чтобы несколько приложений обращались к одной и той же информации цепочки для ключей, вы должны сгенерировать универсальный AppID (#####. Com.prefix. *) ...
Я не обнаружил, что готовый помощник DropDownList очень хорошо работает с привязкой модели. Мне всегда приходится брать значение DropDownList из ViewData и вручную отображать значение в моем контроллере до фиксации изменений в репозитории или базе данных.
Большую часть времени я использую DropDownList, чтобы показать параметры для отношение настраиваемого типа (например, «Отделы для человека»). MVC не может знать, как сопоставить объект просто на основе значения выбранного элемента в списке. Скорее, вам нужно взять этот объект, используя выбранное значение, и отобразить его самостоятельно. Я не знаю, проблема в этом, и я не пробовал привязывать список моделей к модели с простыми типами в качестве опций (например, количество продуктов для покупки или что-то в этом роде), но я
Я постараюсь направить вас со стороны MVC, так как я считаю, что здесь проблема
В методе Create () вы создаете объект Person и список отделов из базы данных, то оба объекта передаются в представление. Представление берет данные из списка отделов и использует их для визуализации HTML-формы, используя только идентификатор и имя.
На следующем этапе форма отправляется на сервер как набор пар «значение-ключ» (стандартный POST) . Механизм маршрутизации берет запрошенный URL-адрес из атрибута действия и преобразует его в действие PersonController.Create (модель человека). Аргументом этого метода является Person, поэтому связыватель данных срабатывает, создает новый экземпляр класса Person и пытается сопоставить входящие данные со свойствами Person. В случае Department входящее значение - это Id отдела (потому что это то, что вы устанавливаете в качестве члена значения для DropDownList), тогда как свойство Department в классе Person, вероятно, имеет тип Department. Это несоответствие, поэтому оно не может заполнить свойство, и оно остается пустым.
Как видите, это не ограничение DropDownList, проблема в том, что вы не можете передать все данные отдела в DropDownList и воссоздать их во время сохранения (как с человеком) из-за характера запроса POST , и именно поэтому DropDownList принимает только два значения из каждого отдела (значение и имя).
Мое обычное решение: поскольку обычно мои модели не являются теми же классами, что и мои бизнес-объекты, я делаю это, имея два свойства в модель: получить только свойство IEnumerable и еще одно свойство DepartmentId (получить / установить). Затем я использую его так:
<%= Html.DropDownList("DepartmentId", Model.Departments) %>
Затем в действии сохранения я беру Department из базы данных с помощью DepartmentId, назначаю его Person и сохраняю.
В вашем случае (модели являются бизнес-объектами) я бы, вероятно, не пытался чтобы связать отдел с моделью человека автоматически, но просто возьмите идентификатор и сделайте это самостоятельно.
Это всего лишь предположение (я не специалист по EF), но я думаю, у вас может быть другая проблема: если db - это поле на контроллере, и оно воссоздается при каждом запросе, это может быть ненужными накладными расходами. Я надеюсь, что он не открывает соединение с базой данных каждый раз, пожалуйста, проверьте это.
Надеюсь, что это поможет
В вашем случае (модели являются бизнес-объектами) я, вероятно, не стал бы пытаться автоматически привязать отдел к модели Person, а просто взял бы идентификатор и сделал это сам.
Это всего лишь предположение (я не специалист по EF), но я думаю, у вас может быть другая проблема: если db является полем на контроллере и воссоздается при каждом запросе, это может быть ненужными накладными расходами. Я надеюсь, что он не открывает соединение с базой данных каждый раз, пожалуйста, проверьте это.
Надеюсь, что это поможет
В вашем случае (модели являются бизнес-объектами) я, вероятно, не стал бы пытаться автоматически привязать отдел к модели Person, а просто взял бы идентификатор и сделал это сам.
Это всего лишь предположение (я не специалист по EF), но я думаю, у вас может быть другая проблема: если db является полем на контроллере и воссоздается при каждом запросе, это может быть ненужными накладными расходами. Я надеюсь, что он не открывает соединение с базой данных каждый раз, пожалуйста, проверьте это.
Надеюсь, что это поможет
Я использую ViewModel (смотрите учебное пособие NerdDinner, ссылки внизу).
Во-первых, нужно подделать ограничение постороннего ключа, расширив модель на часть:
public partial class Person
{
public int DepartmentId
{
get
{
if(this.DepartmentsReference.EntityKey == null) return 0;
else
return (int)this.DepartmentsReference.EntityKey.EntityKeyValues[0].Value;
}
set
{
this.DepartmentsReference.EntityKey =
new EntityKey("YourEntities.DepartmentSet", "Id", value);
}
}
}
Во-вторых, создайте ViewModel:
public class PersonFormViewModel
{
public SelectList Departments { get; set: }
public Person Pers { get; set; }
public PersonFormViewModel(Person p, List<Department> departments)
{
this.Pers = p;
this.Departments = new SelectList(departments, "Id", "Name", p.DepartmentId);
}
}
В-третьих, действие контроллера (сокращенный пример создания):
public ActionResult Create()
{
YourEntities entities = new YourEntities();
List<Department> departments = entities.DepartmentSet.ToList();
PersonFormViewModel viewModel =
new PersonFormViewModel(new Person(), departments);
return View(modelView);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")]Person personToCreate
{
YourEntities entities = new YourEntities(); // Probably not instantiated here
entities.AddToPersonSet(personToCreate);
entities.SaveChanges();
redirectToAction("Index");
}
В-четвертых, фрагмент вида:
<p>
<label for="Name">Name:</label>
<%= Html.TextBox("Name", Model.Pers.Name) %>
<%= Html.ValidationMessage("Name", "*") %>
</p>
<p>
<label for="DepartmentId">Family:</label>
<%= Html.DropDownList("DepartmentId", Model.Departments)%>
<%= Html.ValidationMessage("DepartmentId", "*")%>
</p>
Ссылки: