asp.net-mvc-3 – 如何将MVC3中的HTML和C#代码与Razor混合?

我试图显示一个应该切换类的项目列表,以便进行样式设置。这个想法是创建一个foreach循环,循环遍历Model中的所有myObj。

我尝试了以下代码不起作用(因为我做错了)

@{ int i = 2;
   foreach(var myObj in Model)
   {
        if (i % 2 == 0)
        {
            <div class="class1">
        }
        else
        {
            <div class="class2">
        }
        Html.Partial(...);
        </div>
         i += 1;
   }     
}

什么是正确的方式来完成这个?

更新

我也尝试了以下代码,虽然编译,但并不渲染任何HTML代码(我确定模型中有对象)。

@{ int i = 2;
   foreach(var myObj in Model)
   {
        if (i % 2 == 0)
        {
            @:<div class="class1">
        }
        else
        {
            @:<div class="class2">
        }
        Html.Partial(...);
        @:</div>

        i += 1;
   }

}

这是被调用的部分类

<div class="class">
    <div class="class2">
        @if (string.IsNullOrEmpty(var))
        {
            @var2
        }
        else
        {
            @var
        }
    </div>
    <div class="class3">
        @var3
    </div>
</div>
<div class="class4">
    <p>var4</p>
    <ul class="class5">
        <li>element1</li>
        <li>element2</li>
    </ul>
</div>

对不起,我不能发布实际的名称和变量。

解决方法

我们开始改进你的代码

>改进步骤1:

@foreach(var myObj in Model.Select((model,index) => new { model,index }))
{
    <div class="class@(myObj.index % 2 == 0 ? "1" : "2")">
        @Html.Partial("_Foo",myObj.model)
    </div>
}

>改进步骤2(使用类的自定义HTML助手):

@foreach(var myObj in Model.Select((model,index }))
{
    <div class="@Html.MyClass(myObj.index)">
        @Html.Partial("_Foo",myObj.model)
    </div>
}

MyClass定义如下:

public static string MyClass(this HtmlHelper html,int index)
{
    return (index % 2 == 0) ? "class1" : "class2";
}

>改进步骤3是最先进的(使用Templated Razor Delegates):

@Model.List(
    @<div class="@item.MyClass">
        @Html.Partial("_Foo",@item.Model)
    </div>
)

列表扩展方法如下所示:

public class ModelHolder<T>
{
    public T Model { get; set; }
    public string MyClass { get; set; }
}

public static class RazorExtensions
{
    public static HelperResult List<T>(
        this IEnumerable<T> items,Func<ModelHolder<T>,HelperResult> template
    )
    {
        return new HelperResult(writer =>
        {
            foreach (var item in items.Select((model,index }))
            {
                var myClass = item.index % 2 == 0 ? "class1" : "class2";
                template(new ModelHolder<T> { Model = item.model,MyClass = myClass }).Writeto(writer);
            }
        });
    }
}

我投票改进3号,比原来的foreach循环更好,更简洁。

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....