ASP MVC HTML表单POST列表<entity> </entity>

时间:2010-12-12 18:28:30

标签: asp.net-mvc list post reference viewmodel

今天我一直在努力解决同样的问题。我仍然是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“正常工作”,我愿意接受,但我如何解决我的问题呢?您还需要更多信息吗?

非常感谢,非常感谢帮助!

1 个答案:

答案 0 :(得分:2)

MVC不会自动处理您尝试动态创建表单的方式。它不会将您的表单元素集合绑定到集合,因为它无法区分它们。

尝试this blog post中描述的方法来处理动态集合渲染和模型绑定。