今天我一直在努力解决同样的问题。我仍然是ASP MVC初学者,来自Flex世界。但现在我正在开发一些ASP MVC项目。
我认为这是一个非常复杂的问题,因此我试图非常详细地描述问题。所以,提前感谢你,你正在谈论时间来完成这个!
系统说明:
我正在尝试构建一个“ProjectManagementSystem”。您可以拥有多个项目,其中每个项目都有名称和描述。项目还列出了其他详细信息。一个普通的表格让我输入一个新项目的名称和描述,对吧?
现在,要求是,可以添加其他表单元素。例如,我想添加一个新输入,让我输入所有现有项目和新项目的可用预算。
预算是一个额外的项目细节。 IE浏览器。当添加预算的a from元素时,会向所有项目添加新项目详细信息。
类:
我得到了“Project”类,它有一个“ProjectDetails”列表,它还提供了一些接口来获取,添加和删除“Project”中的“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”从“ProjectItem”基类继承Name和Value。
我正在尝试创建视图,这将让我编辑特定“项目”的详细信息列表中所有“ProjectDetails”的单个Value属性。 现在,每个“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
}
因此,视图需要呈现“Form”并使用相关“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>
<% } %>
这将正确呈现并显示每个附加细节的表单元素。但是当我回复模型时,构造函数将被调用,这样我就会松开所有引用。彭!
我已经读过,MVC“正常工作”,我愿意接受,但我如何解决我的问题呢?您还需要更多信息吗?
非常感谢,非常感谢帮助!
答案 0 :(得分:2)
MVC不会自动处理您尝试动态创建表单的方式。它不会将您的表单元素集合绑定到集合,因为它无法区分它们。
尝试this blog post中描述的方法来处理动态集合渲染和模型绑定。