MVC如何动态地将输入字段添加到视图模型中
本文关键字:添加 字段 输入 视图 模型 何动态 动态 MVC | 更新日期: 2023-09-27 18:19:45
嗨,我有一个使用以下视图模型的表单
public class MainViewModel
{
public int Id { get; set; }
public List<LotViewModel> Lots { get; set; }
[DisplayName("Number of Lots")]
public int NumberOfFields { get; set; }
}
NumberOfFields在for循环中用于渲染LotViewModels。用户从下拉列表中选择1->4中的一个数字。有一个JS函数,它使用AJAX调用Controller方法来呈现包含正确数量字段的部分视图。当下拉列表发生变化时,会触发此JS函数。
这是控制器方法
[HttpPost]
public PartialViewResult AddLotFields(int numberOfFields)
{
var viewModel = new MainViewModel
{
Lots = new List<LotViewModel>(),
NumberOfFields = numberOfFields
};
return PartialView("~/Areas/Admin/Views/MainController/_LotForm.cshtml", viewModel);
}
这是Javascript
$(function() {
$("#numberOfLotsDD").change(function(event) {
$.ajax({
url: window.g_baseUrl + "MainController/AddLotFields/",
data: {
numberOfFields: $(this).val()
},
cache: false,
type: "POST",
dataType: "html",
success: function(data, textStatus, XMLHttpRequest) {
$("#LotFields").html(data);
}
});
});
});
这很好,但当您提交表单时,viewModel在Lots中不包含任何元素。
呈现输入字段的局部视图是
@model MainViewModel
@for (var i = 0; i < Model.NumberOfFields; i++)
{
Model.Lots.Add(new LotViewModel());
<div class="row">
<div class="col-md-6">
<div class="form-group ">
@Html.LabelFor(model => model.Lots.Last().BatchIdLocation)
@Html.TextBoxFor(model => model.Lots.Last().BatchIdLocation, new { @class = "form-control", @placeholder = "Enter Batch Id tag" })
@Html.ValidationMessageFor(model => model.Lots.Last().BatchIdLocation)
</div>
</div>
<div class="col-md-6">
<div class="form-group ">
@Html.LabelFor(model => Model.Lots.Last().QuantityLocation)
@Html.TextBoxFor(model => Model.Lots.Last().QuantityLocation, new { @class = "form-control", @placeholder = "Enter Quantity tag" })
@Html.ValidationMessageFor(model => Model.Lots.Last().QuantityLocation)
</div>
</div>
</div>
}
我想了几种方法来保存这种表格,但都没用。
我知道如果我真的陷入困境,我可以使用JQuery将表单输入值发送到我的控制器。但如果可能的话,我想避免这种情况,并将解决方案限制在c#和剃刀
您的字段名需要采用Lots[N].PropertyName
的形式,但您的字段名称仅生成为PropertyName
。
不使用model.Lots.Last()
,而是使用实际索引,即model.Lots[i]
。
Suggestion-您可以在服务器端自己创建集合中的项,而不是传递一个标志来查看以生成项数。
[HttpPost]
public PartialViewResult AddLotFields(int numberOfFields)
{
var lots = new List<LotViewModel>();
for (int index = 0; index < numberOfFields; index++)
{
lots.Add(new LotViewModel());
}
return PartialView("~/Areas/Admin/Views/MainController/_LotForm.cshtml", lots);
}
这也将使您能够使用外部因素相关值初始化视图模型属性。
因此,视图的变化如下:
@model List<LotViewModel>
@for (var i = 0; i < Model.Count; i++)
{
<div class="row">
<div class="col-md-6">
<div class="form-group ">
@Html.LabelFor(model => model.Lots[i].BatchIdLocation)
@Html.TextBoxFor(model => model.Lots[i].BatchIdLocation, new { @class = "form-control", @placeholder = "Enter Batch Id tag" })
@Html.ValidationMessageFor(model => model.Lots[i].BatchIdLocation)
</div>
</div>
<div class="col-md-6">
<div class="form-group ">
@Html.LabelFor(model => model.Lots[i].QuantityLocation)
@Html.TextBoxFor(model => model.Lots[i].QuantityLocation, new { @class = "form-control", @placeholder = "Enter Quantity tag" })
@Html.ValidationMessageFor(model => model.Lots[i].QuantityLocation)
</div>
</div>
</div>
}
上述更改还将在html中为每个字段创建适当的名称,以便在表单post中适当地发布数据。