如何在MVC4中使用@foreach来阻止不需要的重新访问

时间:2014-03-29 17:00:57

标签: c# asp.net-mvc asp.net-mvc-4

如何防止重复不需要的文本。请看下面的图片(红线区域)。它似乎是一个循环问题,但不熟悉剃刀语法我有点挣扎。我是MVC4的新手,只是尝试了一个小项目并仍在学习,所以任何帮助都将受到赞赏。

控制器:

public ActionResult Destinations()
{
   string[] departureAirports = new string[3] { "Edinburgh", "London", "Manchester" };
   string[] dCode = new string[3] { "EDI", "LTN", "MAN" };

   var destinationList = new List<Destination>();

   foreach (var airport in departureAirports)
   {
        destinationList.Add(new Destination() { departureName = airport });
   }
   foreach (var code in dCode)
   {
        destinationList.Add(new Destination() { departureCode = code });
   }            
        return View(destinationList);
}

查看:

@model List<Flight.Models.Destination>

<table>
   @foreach (var item in Model)
   {
        <tr>
            <td>Departure Name:</td>
            <td>@item.departureName</td>
            <td>Departure Code:</td>
            <td>@item.departureCode</td>
        </tr>
    }
</table>

型号:

public class Destination
{
    public string departureName { get; set; }

    public string departureCode { get; set; }
}

图像:

enter image description here

3 个答案:

答案 0 :(得分:2)

问题不在Razor代码中,而在于您如何创建destinationList模型。您添加departureAirports,然后在结尾添加dCode。您可以使用LINQ Enumerable.Zip将两个数组合并在一起:

var destinationList = departureAirports
                         .Zip(dCode, (airport, code) => new Destination() { departureName = airport, departureCode = code })
                         .ToList();

或简单地将destinationList创建为List<Destination>而不进行任何转换:

var destinationList = new List<Destination>
    {
        new Destination{ departureCode = "EDI", departureName = "Edinburgh" },
        new Destination{ departureCode = "LTN", departureName = "London" },
        new Destination{ departureCode = "MAN", departureName = "Manchester" }
    };

答案 1 :(得分:1)

您应将机场代码与城市匹配,方法是将其放在一个列表中。你是惊人的机场。我想你打算把它们结合起来。

string[] departureAirports = new string[3] { "Edinburgh,EDI", "London,LTN", "Manchester,MAN" };
foreach (string airport in departureAirports)
{
    string[] data=airport.Split(',');    
    destinationList.Add(new Destination() { departureName = data[0], departureCode=data[1]});
}

return View(destinationList);

答案 2 :(得分:0)

问题不在于Razor语法。问题出在您的控制器内部。让我解释一下这里发生了什么。

您已创建了一个视图,该视图绑定到模型 - List<Destination>。这意味着当您返回一个View,其中一个类型为List<Detsination的对象作为参数传递给构造函数时,此对象将绑定到将要呈现的View对象。现在,如果您的Razor语法正确,那么此视图将自动正确显示模型对象中的内容。那么问题出在你的模型对象中。

此模型对象(destinationList)在控制器中创建,然后作为参数传递给View。看看这个destinationList是如何填充的。您有两个单独的循环来填充Destination对象的两个单独属性的值,然后将其添加到列表中。但是,即使仅为一个属性分配值,也会创建整个Destination对象,但另一个属性的值将设置为其类型的默认值 - 在本例中为null

在第二个循环中,当您为departureCode属性赋值时,每次都会将值分配给新Departure对象的属性。您可能希望将"EDI"分配给departureCode对象的Destination,该对象的departureName属性值设置为"Edinburgh"。但这并不会发生,因为当您将Departure分配给&#39; deprtureCode`时,会创建一个新的"EDI"对象。

所以不要使用以下Departure个对象:

Departure [ departureName = "Edinburgh" , departureCode = "EDI" ]
Departure [ departureName = "London" , departureCode = "LTN"]
Departure [ departureName = "Manchester", departureCode = "MAN"]

你最终拥有:

Departure [ departureName = "Edinburgh", departureCode = null]
Departure [ departureName = "London", departureCode = null]
Departure [ departureName = "Manchester", departureCode = null]
Departure [ departureName = null, departureCode = "EDI"]
Departure [ departureName = null, departureCode = "LTN"]
Departure [ departureName = null, departureCode = "MAN"]

因此是观点的结果。

您应该将代码更改为:

int destinationCount = departureAirports.Count;

for(int i = 0; i < destinationCount ; i++)
    destinationList.Add(new Destination() { departureName = departureAirports[i], departureCode = dCode[i];

但是,只有当您确定dCode数组中每个位置的离场代码与destinationAirports数组中相应位置的机场名称相匹配时,才能执行此操作。

否则请遵循@ Irb的建议。