asp.net-mvc - 将许多相似的视图转换为部分视图
问题描述
我正在更新一个项目,其中许多不同的视图共享相同的布局,它们之间的内容只有微小的差异。
基本布局如下所示:
@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
会导致对服务器的第二次调用,并且需要将额外的操作添加到控制器。
看起来我正在寻找一个布局,但该网站已经使用了一个布局。
处理此问题的正确/最佳实践方法是什么?
解决方案
我认为你的做法是正确的。就我个人而言,我将大视图拆分为较小的功能也意味着控制器等更易于阅读和维护。
除非缓存,否则包括 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 内联返回结果。阅读更多
推荐阅读
- bit-manipulation - 棘手的 Xor 问题 p(x) = x^(x/2) 给定 p(x) 找出 x 的值
- php - 连接到 WooCommerce 过滤器
- html - 无法识别 Web 元素 - selenium 中的 span 类
- java - 从 WordDocument 中提取嵌入的 word doc (Apache POI 4.0.0)
- database-design - 当事人数据建模
- php - 命名目录也可以上传图片
- python - 在循环很长的列表时检查最后一次迭代
- html - 导航子菜单 - 出现在左侧
- node.js - 试图保存到 mongoDB
- javascript - 成功请求的强制返回错误