模板ASP.NET MVC视图

时间:2011-08-18 16:59:26

标签: asp.net-mvc razor

以下是我的视图中用户评分显示的代码:

<div class="leftBlock">
    <div class="leftBlockHead">
        <div class="textHead">
            <b>Users rating</b>
        </div>
    </div>
    <div id="leftBlockContent">
        @foreach (var user in Model)
        {
            <div class="list">
                @user.Login @user.Rating
            </div>
        }
    </div>
</div>

问题是我对其他一些块使用相同的html结构。所以我不想重复这段代码,我需要某种模板,它将块标题和@foreach作为参数。有哪些方法可以实现它?

3 个答案:

答案 0 :(得分:1)

您可以查看创建HTMLHelper类扩展方法来进行此类渲染 您还可以使用HTMLHelper RenderPartial方法。为此,您需要定义

  • 单独的视图类。
  • 有一个与之相关的模型。致电
  • RenderPartial扩展,此视图需要呈现。

答案 1 :(得分:0)

我会继续编写一个自定义的html助手来做这件事...看起来像

@helper YourHelper(Model model){
**DO YOUR FOREACH STUFF IN HERE**
<div class="leftBlock">
    <div class="leftBlockHead">
        <div class="textHead">
            <b>model.Title</b>
        </div>
    </div>
    <div id="leftBlockContent">
        @Html.Raw(model.Content)
    </div>
</div>
}

然后你会用它.. @ YourHelper(model)

http://weblogs.asp.net/jgalloway/archive/2011/03/23/comparing-mvc-3-helpers-using-extension-methods-and-declarative-razor-helper.aspx

答案 2 :(得分:0)

我终于使用了Templated Razor Delegates

以下是我的部分观点:

@model LeftColumnBlockViewModel

<div class="levo_blok1">
    <div class="levo_blok1_head">
        <div class="text_head">
            @Model.Title
        </div>
    </div>
    <div id="levo_blok1_content">
        @Model.Content(null)
    </div>
</div>

以下是它的视图模型:

public class LeftColumnBlockViewModel
    {
        public string Title { get; set; }
        public Func<dynamic, object> Content { get; set; }

        public LeftColumnBlockViewModel(string title, Func<dynamic, object> content)
        {
            Title = title;
            Content = content;
        }
    }

以下是用法:

@Html.Partial(MVC.Shared.Views._LeftColumnBlock, 
              new LeftColumnBlockViewModel(
                  Battles.CurrentBattles, 
                  @<text>
                    @foreach (var currentBattle in Model.CurrentBattlesViewModels) 
                    { 
                        <div class="list">
                            @currentBattle.Budget / @currentBattle.BetLimit% / @currentBattle.StartDate-@currentBattle.EndDate
                        </div> 
                    }
                  </text>))