首页 > 解决方案 > 将许多相似的视图转换为部分视图

问题描述

我正在更新一个项目,其中许多不同的视图共享相同的布局,它们之间的内容只有微小的差异。

基本布局如下所示:

@Html.Partial("_HeadingBar")

<div class="panel grid_4">

    <div class="panel-header">
        <span>@ViewBag.SmallHeader</span>
    </div>

    <div class="panel-body">
        <div class="panel-content">
            @* Welcome.cshtml:
            <p>Please use the navigation bar on the side of the site to utilize the features of the site.</p> *@

            @* Login.cshtml:
            @using (Html.BeginForm())
            {
                if (!ViewData.ModelState.IsValid) ...

                <div class="form-row-inline">
                    @Html.LabelFor(m => m.UserName)
                    @Html.TextBoxFor(m => m.UserName)
                    @Html.ValidationMessageFor(m => m.UserName)
                </div>
                ...
                <button type="submit" class="btn btn-success"><i class="icon-lock"></i> Sign In</button>
            } *@

            @* ChangePassword.cshtml:
            @using(Html.BeginForm())
            {
                ...
                @Html.LabelFor(m => m.NewPassword)
                @Html.PasswordFor(m => m.NewPassword)
                @Html.ValidationMessageFor(m => m.NewPassword)
                ...
            } *@


        </div>
    </div>
</div>

我的想法是将每个视图剥离为独特的内容,使其成为局部视图,并将共享部分变为常规视图。

但我不确定这是正确的方法。添加Html.RenderPartial会导致对服务器的第二次调用,并且需要将额外的操作添加到控制器。

看起来我正在寻找一个布局,但该网站已经使用了一个布局。

处理此问题的正确/最佳实践方法是什么?

标签: asp.net-mvcasp.net-mvc-partialviewasp.net-mvc-layout

解决方案


我认为你的做法是正确的。就我个人而言,我将大视图拆分为较小的功能也意味着控制器等更易于阅读和维护。

除非缓存,否则包括 HtmlRenderPartial 在内的所有辅助方法都会在接收到请求时呈现在服务器端。所以不应该对服务器进行额外的调用。

您可以使用几种 html 辅助方法

不带控制器的部分

@Html.Partial("~/Views/Shared/Partials/SomePartialViewWithNoModel.cshtml")
@Html.Partial("~/Views/Shared/Partials/SomePartialViewWithModel.cshtml", Model)

带控制器的零件

@Html.Action("RenderPartial", "ControllerWithNoModelMethod")
@Html.Action("RenderPartial", "ControllerWithModelMethod", new { content = Model })
@Html.RenderAction("RenderPartial", "ControllerWithNoModelMethod")
@Html.RenderAction("RenderPartial", "ControllerWithModelMethod", new { content = Model })

Action 和 RenderAction 的区别在于 Action 以字符串形式返回结果,而 RenderAction 内联返回结果。阅读更多


推荐阅读