我正在尝试使用循环在HTML中显示List<string>
。我得到以下输出:
System.Collections.Generic.List`1[System.String]
我以前见过这个,但不是我目前编码的方式:
我尝试了2个循环来显示List<string>
中的值,但是它们都返回了相同的上述结果:
HTML
@{
Layout = "~/Administration/Views/Shared/_AdminLayout.cshtml";
}
@using Telerik.Web.Mvc.UI
@using Nop.Plugin.Misc.ExportAttributes.Models;
@model ImportCalculationSheetModel
@using Nop.Web.Framework;
@using (Html.BeginForm())
{
<ul>
@for (int i = 0; i < Model.FailedProductIdsList.Count; i++)
{
<li><b>@Convert.ToString(Model.FailedProductIdsList[i])</b></li>
}
</ul>
}
For循环:
<ul>
@for (int i = 0; i < Model.FailedProductIdsList.Count; i++)
{
<li><b>@Convert.ToString(Model.FailedProductIdsList[i])</b></li>
}
</ul>
Foreach循环:
<ul>
@foreach(var productId in Model.FailedProductIdsList)
{
<li><b>@Convert.ToString(productId);</b></li>
}
</ul>
调试时,我发现List<string>
中只插入了一个值:"99999"
所以它甚至不需要转换为字符串,但我确实这样做,因为在不转换时结果是相同的。
我正在使用的模型:ImportCalculationSheetModel
使用View
@model ImportCalculationSheetModel
模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Nop.Web.Framework;
using Nop.Web.Framework.Mvc;
namespace Nop.Plugin.Misc.ExportAttributes.Models
{
public class ImportCalculationSheetModel : BaseNopModel
{
public List<string> FailedProductIdsList { get; set; }
}
}
所以我的模型只填充了1 List<string>
,列表会填入我的Controller
。
控制器
[HttpGet]
public ActionResult ImportCalculationSheetSucceededWithFailures(ImportCalculationSheetModel model)
{
return View("Nop.Plugin.Misc.ExportAttributes.Views.MiscExportAttributes.ImportCalculationSheetSucceededWithFailures", model);
}
[HttpPost]
public ActionResult ImportCalculationSheet(ImportCalculationSheetModel model)
{
if (ModelState.IsValid)
{
ImportFromCalculationSheet _importFromCalculationSheet = new ImportFromCalculationSheet();
var file = Request.Files["importexcelfile"];
if (file != null && file.ContentLength > 0)
{
_importFromCalculationSheet.ImportProductsFromXlsx(file.InputStream);
model.FailedProductIdsList = _importFromCalculationSheet.FailedToUpdateIds;
}
else
{
return RedirectToAction("ImportCalculationSheet", model);
}
if (model.FailedProductIdsList.Count > 0)
{
return RedirectToAction("ImportCalculationSheetSucceededWithFailures", model);
}
else
{
return RedirectToAction("ImportCalculationSheetSucceeded", model);
}
}
else
{
return RedirectToAction("ImportCalculationSheet", model);
}
}
FailedProductIdsList
在以下行填写:
model.FailedProductIdsList = _importFromCalculationSheet.FailedToUpdateIds;
我可以看到它在调试时没有失败。
问题
为什么for循环和foreach循环返回:
System.Collections.Generic.List`1[System.String]
当我一次只抓住List<string>
中的一个项目,甚至将其转换为字符串时?有没有办法在视图中更好地调试此问题?(视图中的断点未命中)
答案 0 :(得分:4)
使用foreach:
无需转换为字符串,因为FailedProductIdsList
已经是字符串列表。
<ul>
@foreach(var productId in Model.FailedProductIdsList)
{
<li><b>@productId</b></li>
}
</ul>
编辑:
将您的控制器简化为:
[HttpPost]
public ActionResult ImportCalculationSheet(ImportCalculationSheetModel model)
{
var m = new ImportCalculationSheetModel {
FailedProductIdsList = new List<string> { "test1", "test2", "test3" }
};
if (ModelState.IsValid)
{
return View("ViewName", m);
}
}
会打印清单吗?
答案 1 :(得分:1)
我发现并修复了问题:
我正在重定向到我的代码中的一个动作,我不应该做什么,因为模型将被清除。
所以不要使用代码:
if (model.FailedProductIdsList.Count > 0)
{
return RedirectToAction("ImportCalculationSheetSucceededWithFailures", model);
}
我现在使用以下代码:
if (model.FailedProductIdsList.Count > 0)
{
return View("Nop.Plugin.Misc.ExportAttributes.Views.MiscExportAttributes.ImportCalculationSheetSucceededWithFailures", model);
}
不同之处在于我没有调用创建新清理模型的其他方法,但我将模型直接发送到View。