Сегодня я борюсь с той же проблемой весь день. Я все еще начинаю 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 «просто работает», как это, и я готов принять это, но как я могу решить мою проблему? Вам больше нужна информация?
Спасибо, очень понравилась бы помощь!
Можете ли вы сказать, что вы ожидаете получить на стороне сервера после обратной передачи? Я действительно не получаю ваш «конструктор будет вызван, и таким образом я потеряю все мои ссылки». О каком конструкторе вы говорите? Также вы можете показать код действия контроллера? –
Привет, Андрей, я имею в виду, что конструктор модели представления вызывается, поэтому вся информация (ссылки) будет потеряна. Метод POST-действия в контроллере получит новый экземпляр модели представления. Не важно знать, как это выглядит. Если я не создаю новый «Проект» в конструкторе модели представления, ссылки на «Проект» будут равно null. Я убедился, что свойства модели представления были правильно заполнены, когда я передал ее на первый взгляд. – dasnervtdoch