从HTML.Helper返回视图

时间:2015-01-30 16:58:58

标签: asp.net asp.net-mvc

我实际上有两个问题。我正在构建一个帮助程序来控制何时向公众呈现某些内容。我有一个客户网站需要内容在特定时间上线。因此,例如,主页上的新英雄图像需要在12日凌晨1点上线,并且需要在凌晨1点停止在19日呈现。我需要能够在我的视图中使用这个帮助器,如下所示:

@Html.DurationControl("Partial/_HeroImage", new DateTime(2015, 02, 12, 01, 00, 00), new DateTime(2015, 02, 19, 01, 00, 00))

是否可以从HTML.Helper返回部分视图?

这种方法是实现目标的最佳方式吗?

public static PartialViewResult DurationControl(this HtmlHelper html, string view, DateTime start, DateTime end){
    DateTime Now = DateTime.Now;
    if (Now > start && Now < end)
    {
        return PartialView(view);
    }
}

注意:感谢Berin Loritsch和Chris Pratt的以下答案,我能够让它发挥作用。以下是我最终的结果:

public static MvcHtmlString DurationControl(this HtmlHelper html, string view, DateTime start, DateTime end)
    {
        DateTime Now = DateTime.Now;
        if (Now > start && Now < end)
        {
            return html.Partial(view);
        }
        else
        {
           return null;
        }
    }

3 个答案:

答案 0 :(得分:1)

在Asp.Net MVC中,您有两个想要保持直观的概念:

  • 请求的整个结果( Views
  • 要包含在网页上的代码段( Partials

目前还不清楚你要根据时间控制哪些,所以我将涵盖这两种情况。

选择一页与另一页

您在控制器中收到一个请求,并选择要返回的视图。在这种情况下,您的代码非常简单:

[Post]
public ActionResult Page(string view, DateTime start, DateTime end)
{
    // We are handling user input from a form
    DateTime Now = DateTime.Now;
    if (Now > start && Now < end)
    {
        return View(view);
    }

    return View();
}

您很可能会从您自己的代码中提取视图以及开始和结束日期,甚至是会话信息。这种方法的效果是返回一页而不是另一页。

嵌入代码段

这是HTML帮助程序的用武之地。部分通常以前导下划线命名&#34; _Partial.cshtml&#34;。 HTML帮助程序的要点是在处理输出流时写入。从本质上讲,它为您插入HTML。在这种情况下,您可以稍微更改一下代码:

public static ActionResult DurationControl(this HtmlHelper html,
              string view, DateTime start, DateTime end)
{
    DateTime Now = DateTime.Now;
    if (Now > start && Now < end)
    {
        RenderPartial(view);
    }
}

MVC将首先查看当前控制器的视图,然后回到共享视图文件夹,如果它在那里找不到它。

答案 1 :(得分:0)

没有。视图应该由控制器返回,因此您可以将逻辑放在那里。 HTML Helpers可以帮助您在视图中构建一些自定义内容(但在大多数情况下,PartialViews也更适合这里)。

答案 2 :(得分:0)

如果你只是把它放在你的视图中,这就是你拥有的代码:

@if (DateTime.Now > new DateTime(2015, 02, 12, 01, 00, 00) && DateTime.Now < new DateTime(2015, 02, 19, 01, 00, 00))
{
    @Html.Partial("partial/heroimage")
}

当然,它不是最漂亮的东西,但它也不是那么糟糕。可以说这是完全可以接受的。如果你真的需要抽象出这个相当基本的逻辑,你只需要对你的帮助器进行建模,就像这段代码一样:

public static MvcHtmlString DurationControl(this HtmlHelper helper, string partial, DateTime start, DateTime end)
{
    if (DateTime.Now > start && DateTime.Now < end)
    {
        return helper.Partial(partial);
    }
    return new MvcHtmlString();
}