【发布时间】:2021-10-07 19:52:58
【问题描述】:
我正在做一个 .NET Core MVC 项目。在部分视图中,我希望用户的一些信息填写为 HTML 表单。该信息是模型的变量,因此每个填充列表都是一个对象。用户填充对象后,我想将该对象作为该对象的列表发送到我的控制器。用户可以发送 3 个表格或 5 个表格或 1 个表格。我的问题是,当只发送 1 个表单时,一切正常,我将模型的变量名称作为名称属性提供给表单标记中的 HTML 输入,并且我的对象正在填充。但是在那种我不知道会有多少对象的情况下,我不知道如何获得对象列表。我希望它是清楚的。
这是我的观点:
@model List<EpubAdmin.Models.KyProducts>
@{
ViewData["Title"] = "AddBook";
Layout = null;
}
@foreach(var product in Model)
{
<div class="col col-xl-12">
<div class="row justify-content-center">
<div class="col-xl-5 col-lg-5 ">
<form method="post" action="/File/AddProductFile" enctype="multipart/form-data" id="myForm">
<br />
<b>Kitap Adı: </b>
<input class="form-control" value="@(Html.Raw(product.Name))" name="Name"/>
<br />
<b>Sayfa Sayısı: </b>
<input class="form-control" value="@product.PageNumber" name="PageNumber" />
<br />
<b>Product Id: </b>
<input class="form-control" value="@product.KyProductId" name="KyProductId" readonly />
<br />
<b>Barkod: </b>
<input class="form-control" value="@product.Barcode" name="Barcode" readonly />
<input class="form-control" value="@product.Author" name="Author" hidden />
<input class="form-control" value="@product.ImageId" name="ImageId" hidden />
<input class="form-control" value="@product.PublisherName" name="PublisherName" hidden />
<input class="form-control" value="@product.PublisherId" name="PublisherId" hidden />
<br />
@*<select class="selectpicker" data-live-search="true" data-show-subtext="true">
<option value="0">Tarih</option>
<option value="1">Çocuk</option>
<option value="2">Psikoloji</option>
<option value="3">Kültür</option>
</select>*@
@if (product.IsDuplicate)
{
<div class="alert alert-danger">
<p>* Bu kitap zaten ekli.</p>
</div>}
else
{
<h5>Kategori Seç</h5>
<select class="form-select ml-0" data-live-search="true">
<option selected>Tarih</option>
<option value="1">Çocuk</option>
<option value="2">Psikoloji</option>
<option value="3">Kültür</option>
</select>
<select class="form-select ml-5">
<option selected>Tarih</option>
<option value="1">Çocuk</option>
<option value="2">Psikoloji</option>
<option value="3">Kültür</option>
</select>
<select class="form-select ml-5">
<option selected>Tarih</option>
<option value="1">Çocuk</option>
<option value="2">Psikoloji</option>
<option value="3">Kültür</option>
</select>
<br />
<br />
<label for="file">Yüklenecek kitabı seçin.</label>
<input type="file" class="form-control-file" id="File" accept=".epub" name="File">
}
</form>
<br />
<br />
</div>
</div>
<br />
<hr />
<br />
</div>
}
<div class="float-right">
<button class="btn btn-info w-100" onclick="onclk()">Ekle</button>
</div>
<br />
<br />
<script>
function onclk() {
$("#myForm").submit();
alert("a");
}
</script>
控制器:
[HttpPost]
public IActionResult AddProductFile(List<KyProducts> model)
{
foreach(var product in model)
{
if (product.file == null || product.KyProductId == 0 || product.PublisherId == 0)
{
return RedirectToAction("List", "Books");
}
}
}
我曾考虑在我的视图中使用 for 而不是 foreach,这样我就可以获取索引并将我的 HTML 属性命名为 name="id+@i",但这对我来说似乎不是最佳实践,并且不确定它是否有效。我还考虑过为每个表单设置隐藏的提交按钮,并在单击主提交按钮时触发所有隐藏的提交按钮,但这似乎又不是最佳实践......你有什么想法?
【问题讨论】:
-
如果您希望用户能够单独提交每个产品,并且验证也是独立的,那么拥有多个表单就可以了。您将无法一次提交多个表单,因为每个表单都会触发对
action属性中 URL 的请求。您还应该确保每个表单都有一个唯一的 ID;目前它们都将具有相同的 ID,并且该按钮只会提交第一个表单。如果您希望用户一次只能提交所有这些,那么最好使用一个表单。也许添加一个隐藏字段,其中包含唯一标识产品的内容。 -
我希望用户能够一次提交所有这些,但如果它们是我想要的格式,我还需要一一验证它们。因为然后我将它们写入数据库。关于拥有多种表格,您的意思是像我对循环或一些表格所做的那样,因为我不知道我需要多少这将取决于列表的大小。而且我认为我可能不需要将它们作为表单提交,我正在考虑是否可以使用 ajax 请求做一些事情,如果我可以查看整个填充列表。另外,您如何看待给他们 id 和他们的索引,这样他们就可以是唯一的
-
或者也许我放弃了这个,只是在每个产品旁边添加一个 + 图标,然后我希望用户按下 +“只是为了确定”他们想要添加它们并且每次按下+ 和另一个控制器一起,我把它们变成了一个列表。那会容易得多:)
-
:) 非常正确。越简单越好。
标签: c# html asp.net-core asp.net-core-mvc