2010-12-12 2 views
4

Сегодня я борюсь с той же проблемой весь день. Я все еще начинаю ASP MVC, исходя из мира Flex. Но теперь я работаю над некоторым проектом ASP MVC.ASP MVC HTML-форма POST-список <Entity>

Я думаю, что это довольно сложная проблема, поэтому я пытаюсь описать проблему очень подробно. Так что спасибо заранее, что вы говорите время, чтобы пройти через это!

Описание системы:

Я пытаюсь построить "ProjectManagementSystem". Вы можете иметь несколько проектов, где каждый проект имеет имя и описание. В проекте также есть список дополнительных сведений. Нормальная форма позволила бы мне ввести имя и описание для нового проекта, не так ли?

Теперь требование состоит в том, что дополнительные элементы формы могут быть добавлены. Например, я хочу добавить новый ввод, который позволит мне ввести доступный бюджет для всех существующих и новых проектов.

Бюджет - дополнительная деталь проекта. IE. когда добавляется элемент a из бюджета для бюджета, добавляется новая деталь проекта для всех проектов.

Классы:

Я получил класс «Проект», который имеет список «ProjectDetails», а также обеспечивает некоторый интерфейс, чтобы получить, добавлять и удалять «ProjectDetail» от «Проекта»:

public class Project : ProjectItem 
{ 
    public virtual IList<ProjectDetail> Details { get; set; } 

    public Project(string name, string description) : base(name, description) 
    { 
     Details = new List<ProjectDetail>(); 
    } 

    public Project() 
     : this("new project", "this is a new project") 
    { 

    } 

    public virtual void AddDetail(string name) 
    { 
     var detail = GetDetail(name); 

     if (detail == null) 
     { 
      detail = new ProjectDetail(name, "empty"); 
      detail.Project = this; 
      Details.Add(detail); 
     } 
    } 

    public virtual void RemoveDetail(string name) 
    { 
     var detail = GetDetail(name); 

     if (detail != null) 
     { 
      detail.Project = null; 
      Details.Remove(detail); 
     } 
    } 

    public virtual ProjectDetail GetDetail(string name) 
    { 
     ProjectDetail result = null; 

     foreach (ProjectDetail detail in Details) 
     { 
      if (detail.Name.Equals(name)) 
      { 
       result = detail; 
      } 
     } 

     return result; 
    } 
} 

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

public class ProjectDetail : ProjectItemDetail 
{ 
    [NotNull] 
    public virtual Project Project { get; set; } 

    public ProjectDetail(string name, string value) 
     : base(name, value) 
    { 

    } 

    public ProjectDetail() 
     : this("new project detail", "empty") 
    { 

    } 
} 

Обратите внимание, что "ProjectDetail" наследует имя и значение п rom "ProjectItem" базовый класс.

Я пытаюсь создать представление, которое позволит мне изменить одно свойство Value всех «ProjectDetails» в списке деталей конкретного «Проекта». Теперь каждый «ProjectDetail» связан с «FormElement», и они соответствуют свойству Name.

public class FormElement 
{ 
    public static string TYPE_UNKNOWN = "typeUnknown"; 
    public static string TYPE_NUMERIC = "typeNumeric"; 
    public static string TYPE_CHAR  = "typeChar"; 
    public static string TYPE_DATE  = "typeDate"; 

    [NotNull] 
    public virtual string Name { get; set; } 

    [NotNull] 
    public virtual int Position { get; set; } 

    [NotNull] 
    public virtual string Type { get; set; } 

    [NotNull] 
    public virtual Form Form { get; set; } 

    public FormElement(string name, int position, string type) 
    { 
     Name = name; 
     Position = position; 
     Type = type; 
    } 

    public FormElement() 
     : this("unknownFormElement", -1, TYPE_UNKNOWN) 
    { 

    } 

} 

И «Форма» класс:

public class Form : Entity 
{ 
    [NotNull] 
    public virtual string Name { get; set; } 

    public virtual IList<FormElement> FormElements { get; set; } 

    public Form(string name) 
    { 
     Name = name; 

     FormElements = new List<FormElement>(); 
    } 

    public Form() 
     : this("unknownWebform") 
    { 

    } 

    //public interface for getting, adding, deleting FormElement 
} 

Таким образом, представление нужно будет оказывать «форму» и заполнить элементы с величиной, связанной «ProjectDetail».

Таким образом, точка зрения получает прошел в «ProjectEditModel»:

public class ProjectEditModel 
{ 
    public Form Form; 

    public Project Project; 

    public ProjectViewModel() {} 
} 

Следующая точка зрения сильно типизированных к «ProjectEditModel»:

<% using (Html.BeginForm("Edit", "Project", FormMethod.Post)) 
    {%> 

     <div> 
     <fieldset> 
      <legend>Edit Project</legend> 

      <div class="editor-label"> 
       <%: Html.LabelFor(m => m.Project.Name) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(m => m.Project.Name)%> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(m => m.Project.Description)%> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(m => m.Project.Description)%> 
      </div> 

      <% 

       foreach (var formElement in Model.Form.FormElements) 
       { 
        if (formElement.Type.Equals(Domain.Model.FormElement.TYPE_CHAR)) 
        { 
        %> 
         <div class="editor-label"> 
          <%: Html.Label(Model.Project.GetDetail(formElement.Name).Name)%> 
         </div> 
         <div class="editor-field"> 
          <%: Html.TextBoxFor(m => m.Project.GetDetail(formElement.Name).Value)%> 
         </div> 
        <% 
        } 
        if (formElement.Type.Equals(Domain.Model.FormElement.TYPE_NUMERIC)) 
        { 

        } 
       } 

      %> 

      <p> 
       <input type="hidden" name="Id" value="<%: Model.Project.Id %>" /> 
       <input type="submit" value="Save" /> 
      </p> 

     </fieldset> 
    </div> 

<% } %> 

Это сделает правильно и показать элемент формы для каждой дополнительной детали. Но когда я буду возвращать модель POST, конструктор будет вызван, и таким образом я потеряю все свои ссылки. PENG!

Я прочитал, что MVC «просто работает», как это, и я готов принять это, но как я могу решить мою проблему? Вам больше нужна информация?

Спасибо, очень понравилась бы помощь!

+0

Можете ли вы сказать, что вы ожидаете получить на стороне сервера после обратной передачи? Я действительно не получаю ваш «конструктор будет вызван, и таким образом я потеряю все мои ссылки». О каком конструкторе вы говорите? Также вы можете показать код действия контроллера? –

+0

Привет, Андрей, я имею в виду, что конструктор модели представления вызывается, поэтому вся информация (ссылки) будет потеряна. Метод POST-действия в контроллере получит новый экземпляр модели представления. Не важно знать, как это выглядит. Если я не создаю новый «Проект» в конструкторе модели представления, ссылки на «Проект» будут равно null. Я убедился, что свойства модели представления были правильно заполнены, когда я передал ее на первый взгляд. – dasnervtdoch

ответ

2

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

Попробуйте методологию, описанную в this blog post, для обработки динамического сбора коллекции и привязки к модели.