Как вы делаете форму создания в MVC 2, которая содержит списки? - PullRequest
0 голосов
/ 22 февраля 2011

У меня есть модель с двумя объектами, один - это класс с проверками и свойствами для описания нового сотрудника, второй - список возможных прав доступа, которые, возможно, потребуется предоставить новому сотруднику.

public class EmployeeViewModel
{
    public NewEmployee.Models.EmployeeModel Employee { get; set; }
    public IList<RequestedAccessViewModel> AvailibleAccesses { get; set; }
}
public partial class EmployeeModel
{
    public DateTime DateRequested { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Initials { get; set; }
    public string UserName { get; set; }
    public string Department { get; set; }
    public string RequestedLocation { get; set; }
    public string CubicleNumber { get; set; }
    public string Supervisor { get; set; }
    public DateTime StartDate { get; set; }
    public string EmployeeJobFunction { get; set; }
    public int Id { get; set; }
}
public class RequestedAccessViewModel
{
    public string Description { get; set; }
    public bool Requested { get; set; }
    public string Comments { get; set; }
    public int Id { get; set; }
}

Мой контроллер выглядит следующим образом: он просто создает новый экземпляр, создает записи списка и некоторые значения свойств сотрудника по умолчанию.

[HttpGet]
public ActionResult Create()
{
    return View(EmployeeViewModel.NewEmployee());
}

Представление выглядит следующим образом:

<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<% Html.RenderPartial("CreateEmployeeData", Model.Employee); %>
<%
    foreach (var access in Model.AvailibleAccesses)
    {
        Html.RenderPartial("CreateRequestedAccessViewModel", access);
    }
%>
<input type="submit" value="Create" />

<%}%>

Форма отображается нормально, я вижу частичное представление для данных сотрудника и 12 частичных представлений для списка доступа.

К сожалению, при созданииПри нажатии кнопки и публикации страницы модель возвращается с нулевыми свойствами.

[HttpPost]
public ActionResult Create(EmployeeViewModel model)
{
    // "model" is not null, but it's two properties are!
}

Если вы посмотрите на Request.Form, это выглядит так:

DateRequested=2%2f22%2f2011+12%3a47%3a22+PM&
FirstName=&
LastName=&
Initials=&
UserName=&
Department=&
RequestedLocation=&
CubicleNumber=&
Supervisor=asawyer&
StartDate=2%2f25%2f2011+12%3a47%3a22+PM&
EmployeeJobFunction=&
Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&
Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&
Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=

Это довольно очевидноэто не способ сделать это.Тогда мой вопрос: как правильно создать такую ​​форму?

Является ли моя попытка настолько ошибочной, что ее следует отменить и начать заново?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Попробуйте использовать шаблон редактора:

<% using (Html.BeginForm()) {%>
    <%: Html.ValidationSummary(true) %>
    <% Html.RenderPartial("CreateEmployeeData", Model.Employee); %>
    <%: Html.EditorFor(x => x.AvailibleAccesses)
    <input type="submit" value="Create" />
<% } %>

и внутри ~/Views/Shared/EditorTemplates/RequestedAccessViewModel.ascx:

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.RequestedAccessViewModel>" 
%>
<div>
    <%: Html.LabelFor(x => x.Description) %>
    <%: Html.TextBoxFor(x => x.Description) %>
</div>
...

Теперь это должно быть правильно привязано к:

[HttpPost]
public ActionResult Create(EmployeeViewModel employee)
{
    ...
}

Поскольку шаблон редактора будет отображаться для каждого элемента коллекции, вы можете добавить некоторые элементы в эту коллекцию, которые вы передаете в действии GET (EmployeeViewModel.NewEmployee).

0 голосов
/ 22 февраля 2011

Думаю, проблема в том, что в одной форме одни и те же поля отображаются несколько раз.В html вам разрешено делать это, но ТОЛЬКО если вы дифференцируете поля, используя правильные обозначения, подобные этому:

<form>
  <input type="text" name="requested[]" />
  <input type="text" name="requested[]" />
  ...
</form>

Тогда большинство языков на стороне сервера позволяют вам ссылаться на правильные «запрошенные» впубликовать данные по индексу, например: posdata [запрашивается] [0] (псевдокод).Если вывод html не похож на этот, вам придется придумать другой способ визуализации вашей формы.После того, как вы это сделаете, возникает вопрос, может ли ModelBinder по умолчанию обработать его и правильно вернуть список этого свойства

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...