c# - 从 Razor 视图返回列表到操作
问题描述
我有一个Action
循环未知数量的值的地方。这些是与设备相关的通道,用户从下拉列表中选择设备,并根据设备拥有的通道数创建表单,它可以是 1 或 50 或介于两者之间的任何位置。
//This is the model I use
[Display(Name = "Select a customer")]
public IEnumerable<SelectListItem> CustomerNames { get; set; }
public string CustomerNameSelected { get; set; }
[Display(Name = "Select a device")]
public IEnumerable<SelectListItem> Devices { get; set; }
public string DeviceSelected { get; set; }
[Display(Name = "Channel Name")]
public string ChannelName { get; set; }
[Display(Name = "Channel Type")]
public string ChannelType { get; set; }
[Display(Name = "Calculated")]
public bool Calculated { get; set; }
public int ChannelCount { get; set; }
public List<ChannelManagerModel> ChannelNames { get; set; }
private List<string> UomList {
get
{
var l = new List<string>();
l.Add("Electricity");
l.Add("Gas");
l.Add("Water");
l.Add("Heat");
l.Add("kWh");
l.Add("Wh");
l.Add("kVarh");
l.Add("Wh");
l.Add("Volts 1");
l.Add("Volts 2");
l.Add("Volts 3");
l.Add("Current 1");
l.Add("Current 2");
l.Add("Current 3");
l.Add("Hz");
l.Add("Litres");
l.Add("Cubic Metres");
l.Add("Cubic Feet");
return l;
}
}
public IEnumerable<SelectListItem> Uom {
get {
List<SelectListItem> sl = new List<SelectListItem>();
foreach (var item in UomList)
{
sl.Add(new SelectListItem() { Text = item, Value = item });
};
return sl;
}
set { }
}
public string UomSelected { get; set; }
由于我现在使用循环创建了新的表单元素,如何使用 ViewModel 将这些额外信息传递回操作。
@{List<string> channelName = Model.ChannelNames.Select(x => x.ChannelName).OrderByDescending(x => Model.ChannelName).ToList();
int count = 0;
foreach (var channel in channelName)
{
count++;
var ddlId = ("ddlId" + count).ToString();
var txtBoxId = ("txtBoxId" + count).ToString();
<tr>
<td>
@Html.Label(@channel)
</td>
<td>
@Html.DropDownListFor(x => x.UomSelected, Model.Uom, "Select", new { @class = "form-control form-control-sm", @id = @ddlId, @data_val = false })
<script type="text/javascript">
$('#@ddlId').change(function () {
$('#@txtBoxId').val($(this).val());
});
</script>
</td>
<td>
@Html.EditorFor(model => model.ChannelType, new { htmlAttributes = new { @id = @txtBoxId, @class = "form-control form-control-sm" } })
@Html.ValidationMessageFor(model => model.ChannelType, "", new { @class = "text-danger" })
</td>
<td>
@Html.CheckBoxFor(model => model.Calculated)
</td>
</tr>
}
}
我想在我的脑海中我正在考虑创建另一个列表以传回视图,但我无法弄清楚如何去做,或者它是否是正确的方法。
这是我想将新数据传回的控制器中的操作。
public async Task<ActionResult> SaveData(ChannelManagerViewModel cvm)
{
var cm = new channelManagerModel();
//Maybe loop through the ViewModel and add to the EF Model
var channelManagerModel = new ChannelManagerModel();
if (ModelState.IsValid)
{
db.ChannelManager.Add(channelManagerModel);
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(channelManagerModel);
}
解决方案
前几天这样做了,在您的视图中使用for(int count...
循环而不是 foreach ,如下所示;
for(int count=0;count<channelName.Count;count++) {
<tr>
<td>
@Html.Label(@channelName[count])
</td>
<td>
@Html.DropDownListFor(x => x[count].UomSelected, Model.Uom, "Select", new { @class = "form-control form-control-sm", @data_val = false })
</td>
<td>
@Html.EditorFor(x => x[count].ChannelType, new { htmlAttributes = new { @id = @txtBoxId, @class = "form-control form-control-sm" } })
@Html.ValidationMessageFor(x => x[count].ChannelType, "", new { @class = "text-danger" })
</td>
<td>
@Html.CheckBoxFor(x => x[count].Calculated)
</td>
</tr>
}
现在在您的控制器中,您可以拥有如下所示的内容
public async Task<ActionResult> SaveData(List<ChannelManagerViewModel> cvm)
推荐阅读
- logging - Loki Distributed with S3 backend - 时间戳和 Grafana 连接问题
- security - 如何仅授予对 2 个计算表的 RLS 访问权限?
- firebase - Firebase Firestore:是否可以使用格式保存字符串(例如 JSON.stringify(data, undefined, 4))
- r - 条件 RMarkdown 内联文本
- amazon-dynamodb - 如果表被删除,您能否使用时间点恢复恢复 DynamoDB 表?
- jenkins - 通过 Jenkins 使用 Kubernetes 中的现有服务
- c# - 在实施 ForceReconnect 和完全异步方法时,我必须考虑哪些 Azure 的 SE.Redis 最佳实践
- c++ - 如何指定在 SYCL/DPC++ 中运行程序时要使用的特定 GPU 设备?
- python - 使用“queryset=Product.objects.none()”时出现 Django 表单验证错误(选择一个有效选项)
- reactjs - 一种动态加载 react 组件并避免多个 react 副本的方法