C# 如何在ASP.NET Core MVC中从视图创建对象

C# 如何在ASP.NET Core MVC中从视图创建对象,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,这是我第一次从事web开发,并决定使用ASP.NET核心MVC 当我从视图中为模型创建一个新项时,我还希望能够创建主模型正在使用的模型 我的例子是: 模型合同包含类型为列表的对象。当我从视图中创建合同时,我希望能够从同一视图中为给定合同创建变量 这是从核心脚手架生成的代码 <form asp-action="Create"> <div asp-validation-summary="ModelOnly" class=&qu

这是我第一次从事web开发,并决定使用ASP.NET核心MVC

当我从视图中为模型创建一个新项时,我还希望能够创建主模型正在使用的模型

我的例子是:

模型
合同
包含类型为
列表
的对象。当我从视图中创建
合同时
,我希望能够从同一视图中为给定合同创建变量

这是从核心脚手架生成的代码

    <form asp-action="Create">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Content" class="control-label"></label>
        <textarea oninput="auto_grow(this)" , style="width:90%; min-height: 500px; resize: vertical; overflow: auto" asp-for="Content" class="form-control">
            
        </textarea>
        <span asp-validation-for="Content" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Descrption" class="control-label"></label>
        <input asp-for="Descrption" class="form-control" />
        <span asp-validation-for="Descrption" class="text-danger"></span>
    </div>
    <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
    </div>
</form>

正如您所看到的,除了List[Variable]之外,还显示了合同模型的其他参数,我不确定添加它的最佳方式是什么

public class Contract
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Content { get; set; }

    public List<Variable> Variable { get; set; }

    public string Descrption { get; set; }
}
公共类合同
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
[必需]
公共字符串名称{get;set;}
[必需]
公共字符串内容{get;set;}
公共列表变量{get;set;}
公共字符串描述{get;set;}
}

如果有遗漏的细节,我很抱歉。请随意提问,我很乐意提供

您可以在表单中使用表格来显示您的变量,并且在表单发布时,将带有变量的合同发布到行动中。以下是演示:

控制器:

public IActionResult TestContract()
        {
           
            return View();
        }
        public IActionResult Create(Contract c)
        {
            //passing Contract with List<Variable> to the action,you can do something you want here
            return Ok();
        }
视图:


可变的
可变名称
添加变量
函数Add(){
$('#myTable>tbody')。追加(''+
' ' +
' ');
};
函数删除(d){
$(d).tr.remove();
};
$('#myform')。提交(函数(){
var计数=0;
$('#myTable tbody tr')。每个(函数(){
$(this).find(“input[name='VariableId']”).attr(“name”,“Variable[“+count+”].VariableId”);
$(this).find(“input[name='VariableName']”).attr(“name”,“Variable[“+count+”].VariableName”);
计数++;
});
return true;//返回false以取消表单操作
});
$(“.submit”)。在('click',函数(){
var列表=[];
$('#myTable tbody tr')。每个(函数(){
var obj={};
obj.FirstName=$(this.find(“td”).find(“输入[name='FirstName']”)val();
obj.LastName=$(this.find(“td”).find(“输入[name='LastName']”)val();
obj.Dob=$(this.find(“td”).find(“输入[name='Dob']”)val();
列表推送(obj);
});
$.ajax({
类型:“POST”,
url:'@url.Action(“TestEmployee”,“Test1”),
contentType:“应用程序/json”,
标题:{“RequestVerificationToken”:$('input[name=“\uu RequestVerificationToken”]”)val(),
数据:JSON.stringify(列表)
}).完成(功能(数据){
});
});
结果:

好的,我明白了。显然,搭建过程并不试图递归地遍历合同并为相关实体创建搭建,这是有意义的。当然,没有什么可以阻止你自己添加这个额外的“脚手架”。是的,但是我不能在一个视图中有两个模型。你如何搭建这个?如果您是asp.net核心mvc初学者,为什么不先自己编写所有代码呢?我用asp.net core做过几个项目,但实际上从未使用过这样的功能(脚手架视图)。您应该只需要一个“视图模型”对象,其中包含实现视图所需的所有数据。但是你必须自己写一些代码;脚手架系统非常基本,不具备满足您单独描述的要求的能力。
public class Variable
    {
        public int VariableId { get; set; }
        public string VariableName { get; set; }

    }
    <form asp-action="Create" id="myform">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Content" class="control-label"></label>
        <textarea oninput="auto_grow(this)" , style="width:90%; min-height: 500px; resize: vertical; overflow: auto" asp-for="Content" class="form-control">
            
        </textarea>
        <span asp-validation-for="Content" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Descrption" class="control-label"></label>
        <input asp-for="Descrption" class="form-control" />
        <span asp-validation-for="Descrption" class="text-danger"></span>
    </div>
    <div>
        <table id="myTable">
            <thead>
                <tr>
                    <th scope="col">VariableId</th>
                    <th scope="col">VariableName</th>

                </tr>
            </thead>
            <tbody>
               
            </tbody>
        </table>
    </div>
    
    <div class="row final-mile__step-control">
        <div class="col justify-content-center">
            <button type="button" onclick="Add()">Add Variable</button>
        </div>
    </div>
    <div>
        <input type="submit" value="Submit" />
    </div>
</form>
<script>
        function Add() {
            $('#myTable > tbody').append('<tr><td><input name="VariableId" class="form-control" required="required" placeholder="VariableId" /><span class="field-validation-valid text-danger" data-valmsg-for="VariableId" data-valmsg-replace="true"></span></td>' +
                '<td> <input name="VariableName" class="form-control"  required="required"  placeholder="VariableName" /><span class="field-validation-valid text-danger" data-valmsg-for="VariableName" data-valmsg-replace="true"></span></td>' +
                '<td><input type="button" onclick="Delete(this)" value="Delete" /></td ></tr > ');
        };
        function Delete(d) {
            $(d).closest("tr").remove();
        };
        $('#myform').submit(function () {
            var count = 0;
            $('#myTable tbody tr').each(function () {
                $(this).find("input[name='VariableId']").attr("name", "Variable[" + count + "].VariableId");
                $(this).find("input[name='VariableName']").attr("name", "Variable[" + count + "].VariableName");
                count++;
            });
            return true; // return false to cancel form action
        });
        $(".submit").on('click', function () {
            var list = [];
            $('#myTable tbody tr').each(function () {
                var obj = {};
                obj.FirstName = $(this).find("td").find("input[name='FirstName']").val();
                obj.LastName = $(this).find("td").find("input[name='LastName']").val();
                obj.Dob = $(this).find("td").find("input[name='Dob']").val();
                list.push(obj);
            });
            $.ajax({
                type: "POST",
                url: '@Url.Action("TestEmployee", "Test1")',
                contentType: "application/json",
                headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() },
                data: JSON.stringify(list)
            }).done(function (data) {

            });

        });
    </script>