加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 18:39:41 所属栏目:asp.Net 来源:网络整理
导读:我试图显示一个应该切换类的项目列表,以便进行样式设置。这个想法是创建一个foreach循环,循环遍历Model中的所有myObj。 我尝试了以下代码不起作用(因为我做错了) @{ int i = 2; foreach(var myObj in Model) { if (i % 2 == 0) { div class="class1" } els
我试图显示一个应该切换类的项目列表,以便进行样式设置。这个想法是创建一个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循环更好,更简洁。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读