什么更好?
1)如果我在服务器上制作3个ViewBag,然后使用此ViewBags渲染我的视图?
服务器
ViewBag.LeftColumnTales = tales.Where((x, i) => i % 3 == 0);
ViewBag.CenterColumnTales = tales.Where((x, i) => i % 3 == 1);
ViewBag.RightColumnTales = tales.Where((x, i) => i % 3 == 2);
查看
<div id="left_column">
@foreach (var t in ViewBag.LeftColumnTales)
{
<div class="item">
<a href="/narodnie-skazki/@t.PeopleTalesCategory.RouteNameAn/@t.RouteNameAn">@t.NameAn</a> <span>(@(new HtmlString(Html.TimeForReadingHtmlResult((int)t.TimeForReading))))</span>
@(new HtmlString(Html.PeopleTaleVoterHtmlResult((int)t.Analit)))
</div>
}
<!--end of div.item-->
</div>
或
2)如果我在服务器上设置ViewBag.tales然后在View上将从动态数据转换为IEnumerable并将其分为3列?
服务器
ViewBag.Tales = tales;
查看
<div id="left_column">
@foreach (var t in ((IEnumerable<MVCFairyTales3.Models.AuthorTale>)ViewBag.Tales).Where((x, i) => i % 3 == 0))
{
<div class="item">
<a href="/avtorskie-skazki/@t.AuthorTalesCategory.RouteNameAn/@t.RouteNameAn">@t.NameAn</a> <span>(@(new HtmlString(Html.TimeForReadingHtmlResult((int)t.TimeForReading))))</span>
@(new HtmlString(Html.AuthorTaleVoterHtmlResult((int)t.Analit)))
</div>
}
<!--end of div.item-->
</div>
答案 0 :(得分:5)
什么更好?
说实话,我不喜欢这两个中的任何一个。他们都使用ViewBag和弱打字。我很抱歉,但是当我看到ViewBag / ViewData时,我个人感到恶心。
我个人喜欢使用视图模型和强类型视图:
public class MyViewModel
{
public IEnumerable<Tale> LeftColumnTales { get; set; }
public IEnumerable<Tale> CenterColumnTales { get; set; }
public IEnumerable<Tale> RightColumnTales { get; set; }
}
你可以在你的行动中填充:
public ActionResult Foo()
{
var model = new MyViewModel
{
LeftColumnTales = tales.Where((x, i) => i % 3 == 0),
CenterColumnTales = tales.Where((x, i) => i % 3 == 1),
RightColumnTales = tales.Where((x, i) => i % 3 == 2),
};
return View(model);
}
并在强类型视图中:
@model MyViewModel
<div id="left_column">
@Html.DisplayFor(x => x.LeftColumnTales)
</div>
并在将为集合的每个元素(~/Views/Shared/DisplayTemplates/Tale.cshtml
)呈现的相应显示模板中:
@model Tale
<div class="item">
@Html.ActionLink(
Model.NameAn,
Model.RouteNameAn,
Model.AuthorTalesCategory.RouteNameAn
)
<span>
@Html.Raw(Html.TimeForReadingHtmlResult((int)Model.TimeForReading))
</span>
@Html.Raw(Html.AuthorTaleVoterHtmlResult((int)Model.Analit))
</div>
如果你不得不在你的页面上重复这一点,那么更好的方法是使用Phil Haack in his blog post所解释的子操作将其放在_Layout中。
答案 1 :(得分:0)
我不确定你的app是如何构建/分层的,但总的来说我喜欢将我的业务/域逻辑从我的UI代码中分离出来。它听起来应该是在左/中/右列是严格的UI逻辑。在这种情况下,我会让我的业务层检索/创建所有故事的列表,然后将其留给UI层将其拆分,但是要显示它。
当我想弄清楚某些逻辑是否属于UI层时,我想我会创建许多UI(web,windows,手机,sharepoint webpart等)并问自己是否可能逻辑(例如将其拆分为3列)将在UI之间发生变化。如果答案是肯定的,那么该逻辑属于UI层。