如何在MVC3和Razor中混合HTML和C#代码?

问题描述

| 我正在尝试显示应该出于样式目的而切换类的项目列表。这个想法是创建一个foreach循环,该循环将遍历模型中的所有“ 0”。 我尝试了以下无效的代码(因为我做错了)
@{ 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代码(并且我确定Model中有对象)。
@{ 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(使用模板化剃刀代表):
@Model.List(
    @<div class=\"@item.MyClass\">
        @Html.Partial(\"_Foo\",@item.Model)
    </div>
)
List
扩展方法如下所示:
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循环更好,更简洁。     ,        您需要在行的开头加上格式不正确的标签并加上ѭ10前缀,以防止Razor尝试解析标签。 细节。     ,        您可能会确定某些模型中有对象-但您的模型中没有:) 以下直接从您的示例代码派生的示例工作正常:
@{ int i = 2;
   string[] list = new string[] {\"a\",\"b\",\"c\",\"d\"};
   foreach(var myObj in list)
   {
        if (i % 2 == 0){
            @:<div class=\"class1\">
        }
        else
        {
            @:<div class=\"class2\">
        }
        //Html.Partial(...);
        @:</div>
         i += 1;
   }     
}

    ,        您需要编写
@Html.Partial(...)
才能将结果呈现到页面上。 调用
Html.Partial
会返回带有局部视图的
HelperResult
,但实际上并不会渲染它。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...