今天我一直在努力解决同一个问题。我仍然是来自Flex世界的ASP MVC初学者。但是现在我正在研究一些ASP MVC项目。ASP MVC HTML表单POST列表
我认为这是一个相当复杂的问题,因此我试图描述非常详细的问题。所以,提前谢谢你,你正在谈论时间来通过这个!
系统介绍:
我试图建立一个 “ProjectManagementSystem”。您可以有多个项目,其中每个项目都有一个名称和一个说明。一个项目也有一个额外的细节清单。一个正常的表格会让我输入新项目的名称和描述,对吗?
现在,需求是,可以添加额外的表单元素。例如,我想添加一个新的输入,它可以让我输入所有现有和新项目的可用预算。
预算是一个额外的项目细节。 IE浏览器。当预算的a from元素被添加时,新的项目细节将被添加到所有项目中。
类:
我得到了类“项目”具有“ProjectDetails”的列表,它也提供了一些接口获取,添加并从“项目”删除“ProjectDetail”:
public class Project : ProjectItem
{
public virtual IList Details { get; set; }
public Project(string name, string description) : base(name, description)
{
Details = new List();
}
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” 继承名称和值f rom“ProjectItem”基类。
我想创建视图,这将让我编辑特定“项目”的详细信息列表中的所有“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 FormElements { get; set; }
public Form(string name)
{
Name = name;
FormElements = new List();
}
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”:
{%>
Edit Project
m.Project.Name) %>
m.Project.Name)%>
m.Project.Description)%>
m.Project.Description)%>
foreach (var formElement in Model.Form.FormElements)
{
if (formElement.Type.Equals(Domain.Model.FormElement.TYPE_CHAR))
{
%>
m.Project.GetDetail(formElement.Name).Value)%>
}
if (formElement.Type.Equals(Domain.Model.FormElement.TYPE_NUMERIC))
{
}
}
%>
这将正确渲染和显示表单元素为每一个额外的细节。但是当我做POST回模型时,构造函数会被调用,这样我就会释放所有的引用。彭!
我已经阅读过,MVC“正常工作”就像这样,我愿意接受,但我该如何解决我的问题呢?你需要更多的信息?
非常感谢,非常感谢帮助!
+0
你能告诉你回邮后你期望在服务器端得到什么?我不是真的得到你的“构造函数会被调用,这样我就会丢失所有的引用”。你在说什么构造函数? 另外,你可以显示你的控制器动作码吗? –
2010-12-13 21:42:31
+0
嗨安德烈,我的意思是调用视图模型的构造函数,所以所有的信息(引用)都会丢失。控制器中的POST操作方法将传递视图模型的新实例。知道它的样子并不重要。如果我不在视图模型构造函数中创建新的“项目”,则对“项目”的引用将甚至为空。我确保视图模型的属性在我首先将其传递给视图时正确填充。 –
2010-12-14 15:30:18