【问题标题】:ASP.NET MVC - Reuse complex rendering logicASP.NET MVC - 重用复杂的渲染逻辑
【发布时间】:2013-11-05 20:52:01
【问题描述】:

我正在尝试使用 razor 视图引擎在 asp.net mvc 中渲染面板(很像缩略图或 Web 部件),当我必须一次渲染它们时它很容易,因为我有一个视图和所有的渲染逻辑都在那里。

但是当我不得不向面板组添加一个新面板时,我的问题就开始了,这是我的看法:

@model IEnumerable<FonteDeNoticia>
<div class="row">
    <div class="form-group col-lg-8">
        <div class="input-group">
            <input id="txtUrl" type="text" class="form-control" placeholder="Url">
            <span class="input-group-btn">
                <button id="btnAdicionarUrl" class="btn btn-default" type="button">Add</button>
            </span>
        </div>
    </div>
</div>

<div id="fontesDeNoticia" class="row-fluid">            
    @foreach (var fonte in Model)
    {
        <div class="col-lg-2 col-lg-4">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title"><a href="@fonte.Link" target="_new">@fonte.Nome <span class="badge badge-info">42</span></a><span class="iconeClicavel"><a><i class="icon-remove pull-right"></i></a></span><span class="iconeClicavel"><a><i class="icon-gear pull-right"></i></a></span></h3>
                </div>
                <ul class="list-group">
                    @foreach (var noticia in fonte.Noticias.Take(3))
                    {
                        <li class="list-group-item">
                            <a class="linkDeNoticia" href="@noticia.Link" target="_new">@noticia.Titulo</a>
                            <small class="dataDeNoticia">- @noticia.DataDePublicacao</small>
                        </li>
                    }
                </ul>
            </div>
        </div>
    }
</div>

所以我开始意识到需要改变一些东西......我尝试使用 DisplayForModel,但我渲染面板的方式很重要,我无法让它工作。

然后我想到了将foreach渲染为for循环中的局部视图,但我认为这样做的性能一定很糟糕!

对此有什么想法吗?

【问题讨论】:

  • 是否要在页面中动态添加面板?
  • 看看如果你想动态添加一些东西,你必须使用 ajax.. 所以你只会更新或替换你的页面的一部分。或者您想完全重新呈现您的页面?
  • 我想动态添加面板是的,我试图做一个返回单个面板的操作,但我找不到将它“附加”到现有面板的方法,我知道我可以得到我需要的关于成功回调的信息,但我需要那个 foreach 逻辑。
  • 为了更清楚一点,第一个 foreach 上方的按钮是为了向页面添加一个新面板,但是当发生这种情况时,我需要确保这个新面板通过渲染逻辑。
  • 将代码放入部分视图页面并从 Html.Partial 或 RenderPartial 渲染它们

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

render 循环中的局部视图并不是那么糟糕。因为DisplayForModel 在内部使用 Html.Partial。我已经通过这种方式实现了一个复杂的插件系统。

<div class="row-fluid">
    @if (Model.FooterAreaPlugins != null && Model.FooterAreaPlugins.Count != 0)
    {
        <div id="@Model.ID-plugInGridFooterArea">
            @foreach (var item in @Model.FooterAreaPlugins)
            {
                @Html.Partial("~/Views/Shared/Module.cshtml", item);
            }
        </div>
    }
</div>

当我的应用程序变大时,至少调用了 100 多个 Html.Partial(和一些 Html.Action)来为单个页面渲染许多不同的模型,并且性能没有显着下降。

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2017-05-13
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多