2013-10-08 67 views
3

我試圖在我的HTML中使用循環顯示List<string>。我得到以下輸出:使用循環在HTML(MVC)中顯示列表字符串

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" 所以甚至沒有必要轉換爲字符串,但我這樣做只是可以肯定,因爲沒有轉換的結果是一樣的。

我使用的模型:ImportCalculationSheetModelView使用@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

'FailedProductIdsList'已經是一個字符串列表,所以不需要在循環中再次將它轉換爲字符串。 –

+0

看到這個 - http://stackoverflow.com/questions/17469697/liststring-passed-in-viewbag-gets-spoiled-with-system-collections-generic-lis。它似乎也許'Convert.ToString()''造成了所有問題。 – Leron

+0

你說「model.FailedProductIdsList = _importFromCalculationSheet.FailedToUpdateIds;」中沒有錯誤我懷疑這是問題所在。但是,您可以檢查清單分配給的實際類型。也可以嘗試_importFromCalculationSheet.FailedToUpdateIds.ToList(); – Spock

回答

0

我發現和解決了這一問題:

我重定向到一個動作在我的代碼,我不應該做的,因爲該模型將被清除,然後。

因此,而不是下面的代碼:

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這種方式。

+0

偉大你找到答案。你說:「不同之處在於我沒有調用創建新的乾淨模型的其他方法」。這意味着你的下面的Get Action? [HttpGet] public ActionResult ImportCalculationSheetSucceededWithFailures(ImportCalculationSheetModel model) {在發送給View之前,您是否創建了一個新的乾淨模型?或者你在談論別的東西? – Spock

+0

RedirectToAction,確實將我重定向到創建新模型的[HttpGet]方法,因此列表始終爲空。我現在將填充模型發送到視圖,而不創建新模型,如上面的代碼所示。 – Max

2

使用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); 
    } 
} 

並打印清單?

+0

OP已經提到了有關foreach循環。 – Kaf

+0

You are missing'@' – Satpal

+0

這是我在我的問題中顯示的那種foreach循環,我已經試過了,有和沒有轉換爲字符串 – Max

相關問題