包括剃刀循环

问题描述:

我用一个简单的for循环这样的输出存储在数据库中的图像的表变量:包括剃刀循环

@for(var i = 1; i < 7; i++){ 
<tr> 
<td>Image @i:</td> 
<td><img src="images/@image01" /></td> 
</tr> 
} 

我想要做的就是用我的变量在像场名称,因为在上例中,显然每个图像都是相同的,来自image01字段。我尝试了以下,但它不起作用。有谁知道正确的方式来编码?

@for(var i = 1; i < 7; i++){ 
<tr> 
<td>Image @i:</td> 
<td><img src="images/@[email protected]" /></td> 
</tr> 
} 

我已经尝试了各种各样的东西,但我只是学习来自ASP经典的剃刀语法,所以我只是猜测此刻。

干杯, 千电子伏

如果image01是一个领域,你不能动态地创建一个变量名,你要做的:

@for(var i = 1; i < 7; i++){ 
string imgName; 
if (i == 0) 
    imgName = image01; //store the var in a central variable 
else if (i == 1) 
    imgName = image02; 
else if ... 

<tr> 
<td>Image @i:</td> 
<td><img src="images/@imgName" /></td> 
</tr> 
} 

唯一的其他选择是反射,但我不在Razor的观点中,这是如何做到的。

+0

谢谢布赖恩,但我得到以下错误:“@”在代码块的开头无效 –

+0

我认为这可能是我必须去的方式。 –

+0

@KevinUnderhill哪一行导致错误?我的语法可能有点偏离...不幸的是,除非使用列表或数组来存储名称或替代设计模式,否则没有好的变量名称生成功能。 –

使用明确表达

<img src="images/[email protected](i)" /> 

这会给你的输出像

<img src="images/image01"> 
<img src="images/image02"> 
<img src="images/image03"> 

理想情况下,我会尽量避免使用这样的循环,并在创建视图图像URL值。相反,我将有图像集合在我的ViewModel

public class UserProfile 
{ 
    public string Name { set;get;} 
    public List<UserImage> Images {set;get;} 
    public UserProfile() 
    { 
    Images=new List<UserImage>(); 
    } 
} 
public class UserImage 
{ 
    public string URL { set;get;} 
    public string Caption { set;get;} 
} 

这个视图模型与图像采集

public ActionResult ShowUser(int id) 
{ 
    var user=new UserProfile(); 
    user.Name="SomeName"; 
    //to do : get images from db and set instead of being hard coded 
    user.Images.Add(new UserImage { URL="someImge1.jpg"}); 
    user.Images.Add(new UserImage { URL="someImge2.jpg"}); 
    return View(user); 
} 

而在我们的强类型视图退回到我的观点,我们将显示像,

@model UserProfile 
<table> 
foreach(var img in Model.Images) 
{ 
    <tr> 
    <td><img [email protected]" alt="@img.Caption" /></td> 
    </tr> 
} 
</table> 

我们不在视图中混合任何代码。设置图像url应该在你的Controller中完成。如果图像位于Content文件夹中,则可以使用Url.Content HTML帮助器方法获取路径。