使用循环在HTML(MVC)中显示列表字符串

时间:2013-10-08 09:51:58

标签: c# html asp.net-mvc razor

我正在尝试使用循环在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>中的一个项目,甚至将其转换为字符串时?有没有办法在视图中更好地调试此问题?(视图中的断点未命中)

2 个答案:

答案 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。