asp.net-mvc - ASP MVC HTML 表单 POST List<Entity>

标签 asp.net-mvc list post reference viewmodel

今天我整天都在为同样的问题苦苦挣扎。我仍然是来自 Flex 世界的 ASP MVC 初学者。但现在我正在研究一些 ASP MVC 项目。

我认为这是一个相当复杂的问题,因此我试图非常详细地描述这个问题。所以提前谢谢你,你说的是时间来完成这个!

系统说明:

我正在尝试构建一个“ProjectManagementSystem”。您可以拥有多个项目,其中每个项目都有名称和描述。一个项目还列出了其他详细信息。一个普通的表格可以让我输入一个新项目的名称和描述,对吧?

现在,要求是可以添加额外的表单元素。例如,我想添加一个新输入,让我输入 的可用预算。全部 现有项目和新项目。

预算是额外的项目细节。 IE。添加预算的 a from 元素后,将向所有项目添加新的项目详细信息。

类(class):

我得到了“Project”类,它有一个“ProjectDetails”列表,它还提供了一些接口(interface)来从“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。

我正在尝试创建 View ,这将让我在特定“项目”的详细信息列表中编辑所有“项目详细信息”的单个值属性。
现在,每个“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 
}

因此, View 将需要呈现“表单”并使用相关“ProjectDetail”的值填充元素。

因此, View 在“ProjectEditModel”中传递:
public class ProjectEditModel
{
    public Form Form;

    public Project Project;

    public ProjectViewModel() {}
}

以下 View 被强类型化为“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 像这样“正常工作”,我愿意接受,但是我该如何解决我的问题呢?您需要更多信息吗?

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

最佳答案

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

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

关于asp.net-mvc - ASP MVC HTML 表单 POST List<Entity>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4423231/

相关文章:

sql-server - 使用原始查询、使用 Entity Framework 和 MVC 返回计数

list - 在 Prolog 中搜索(相同)两个元素的列表

string - Haskell 函数取出最后一次出现的输入字符

php - 如何使用 JavaScript 将数据 POST 到远程服务器?

javascript - jquery post 调用路由 laravel 不工作

javascript - AngularJS:删除和添加类时出错:c.attr 不是函数

asp.net-mvc - 缓存 list 与 ASP.NET MVC 下载正确,但站点仍然无法离线使用

javascript - Durandal 路由

python - 如果每个元组中的第二项重复,如何从元组列表中删除元素?

javascript - POST请求后,不要进入成功回调(javascript)