C# 如何在ASP.NET Core MVC中从视图创建对象
这是我第一次从事web开发,并决定使用ASP.NET核心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
合同
包含类型为列表
的对象。当我从视图中创建合同时
,我希望能够从同一视图中为给定合同创建变量
这是从核心脚手架生成的代码
<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>