Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP MVC HTML表单发布列表<;实体>;_Asp.net Mvc_List_Post_Reference_Viewmodel - Fatal编程技术网

Asp.net mvc ASP MVC HTML表单发布列表<;实体>;

Asp.net mvc ASP MVC HTML表单发布列表<;实体>;,asp.net-mvc,list,post,reference,viewmodel,Asp.net Mvc,List,Post,Reference,Viewmodel,今天我整天都在为同样的问题而挣扎。我仍然是ASP MVC初学者,来自Flex世界。但是现在我正在做一些ASP MVC项目 我认为这是一个相当复杂的问题,因此我试图非常详细地描述这个问题。所以,提前谢谢你,你正在谈论的时间,通过这一点 系统描述: 我正在尝试建立一个“项目管理系统”。您可以有多个项目,其中每个项目都有名称和说明。一个项目也有一个附加细节的列表。一个普通的表单可以让我输入一个新项目的名称和描述,对吗 现在,要求是,可以添加额外的表单元素。例如,我想添加一个新的输入,它将允许我输入所有

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

我认为这是一个相当复杂的问题,因此我试图非常详细地描述这个问题。所以,提前谢谢你,你正在谈论的时间,通过这一点

系统描述:

我正在尝试建立一个“项目管理系统”。您可以有多个项目,其中每个项目都有名称和说明。一个项目也有一个附加细节的列表。一个普通的表单可以让我输入一个新项目的名称和描述,对吗

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

预算是一个额外的项目细节。也就是说,当添加预算的a from元素时,将向所有项目添加新的项目详细信息

课程:

我得到了一个“Project”类,它有一个“ProjectDetails”列表,它还提供了一些从“Project”中获取、添加和删除“ProjectDetails”的接口:

注意,“ProjectDetail”从“ProjectItem”基类继承名称和值

我正在尝试创建视图,该视图将允许我编辑特定“项目”详细信息列表中所有“项目详细信息”的单值属性。 现在,每个“ProjectDetail”都与一个“FormElement”相关,并且它们通过名称属性进行匹配

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)
    {

    }

}
和“形式”类:

以下视图强类型为“ProjectEditModel”:


编辑项目
m、 项目名称)%%>
m、 项目名称)%%>
m、 项目说明)%>
m、 项目说明)%>
m、 Project.GetDetail(formElement.Name).Value)%%>

这将正确渲染,并为每个附加细节显示一个表单元素。但是当我发回模型时,构造函数将被调用,这样我就失去了所有引用。彭

我已经读到,MVC“只是工作”像这样,我愿意接受,但我如何解决我的问题呢?你还需要更多的信息吗


非常感谢,非常感谢您的帮助

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


请尝试中描述的方法来处理动态集合呈现和模型绑定。

回发后,您能告诉服务器端希望得到什么吗?我真的不明白你的“构造函数将被调用,这样我就失去了所有引用”。你所说的构造器是什么?另外,您可以显示控制器操作代码吗?嗨,Andrey,我的意思是调用视图模型的构造函数,因此所有信息(引用)都将丢失。控制器中的POST-action方法将获得视图模型的新实例。知道它是什么样子并不重要。如果我没有在视图模型构造函数中创建一个新的“项目”,那么对“项目”的引用甚至将为空。当我首先将视图模型传递给视图时,我确保视图模型的属性已正确填充。
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")
    { 

    }
}
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 
}
public class ProjectEditModel
{
    public Form Form;

    public Project Project;

    public ProjectViewModel() {}
}
<% 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>

<% } %>