Платформа объекта с MVC со строгим контролем типов

Также помните, что при генерации AppID, если вы хотите, чтобы несколько приложений обращались к одной и той же информации цепочки для ключей, вы должны сгенерировать универсальный AppID (#####. Com.prefix. *) ...

12
задан Spooky 19 June 2015 в 20:44
поделиться

3 ответа

Я не обнаружил, что готовый помощник DropDownList очень хорошо работает с привязкой модели. Мне всегда приходится брать значение DropDownList из ViewData и вручную отображать значение в моем контроллере до фиксации изменений в репозитории или базе данных.

Большую часть времени я использую DropDownList, чтобы показать параметры для отношение настраиваемого типа (например, «Отделы для человека»). MVC не может знать, как сопоставить объект просто на основе значения выбранного элемента в списке. Скорее, вам нужно взять этот объект, используя выбранное значение, и отобразить его самостоятельно. Я не знаю, проблема в этом, и я не пробовал привязывать список моделей к модели с простыми типами в качестве опций (например, количество продуктов для покупки или что-то в этом роде), но я

2
ответ дан 2 December 2019 в 22:23
поделиться

Я постараюсь направить вас со стороны 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 является полем на контроллере и воссоздается при каждом запросе, это может быть ненужными накладными расходами. Я надеюсь, что он не открывает соединение с базой данных каждый раз, пожалуйста, проверьте это.

Надеюсь, что это поможет

5
ответ дан 2 December 2019 в 22:23
поделиться

Я использую 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>

Ссылки:

3
ответ дан 2 December 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: