什么是在ASP.net MVC中在视图之间共享变量的最佳方式4.尝试消除重复的代码

时间:2015-07-21 14:51:28

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

处理以下情况的最佳方法是什么?我的_Layout视图中有一些代码检查cookie并尝试在ViewBag中设置true / false变量。然后在另一个视图中,我想检查ViewBag值并对其进行操作。

我想确定用户是否有cookie,并根据该显示AD。

如果我将所有代码都放在_Pictures.cshtml视图中,但我不想将相同的代码复制到每个视图,我可以使用它。我只想在一个地方检查cookie。

我应该使用TempData还是ViewData?似乎应该有一个简单的解决方案,但我有一个大脑放屁。

我得到的错误是:

  

运营商'!'不能应用于' null'

类型的操作数

感谢您的帮助。

这就是我在_Layout.cshtml视图中的内容。

@{
    //Interstitial AD Cookie.
    //Used to determine if user has been shown an interstitial within the last hour.
    ViewBag.shownInterstitial = false;
    if (Request.Cookies["Interstitial"] != null)
    {
        ViewBag.shownInterstitial = true;
    }
    //Interstitial cookie does NOT exist.
    else
    {
       ViewBag.shownInterstitial = false;
    }    
}

这就是我在另一个视图中所拥有的 - Pictures.cshtml

@{
    //Check to see if user has the Interstitial ad cookie.
    //If NOT, then show interstitial ad and set a cookie for 1hr.
    if (!ViewBag.shownInterstitial)
    {
        <div class="hidden-md hidden-lg">
            <div class="adnl_zone id_4034"></div>
        </div>

        //Create a cookie to prevent interstitial spam.
        HttpCookie Cookie = new HttpCookie("Interstitial");
        Cookie.Value = "true";
        Cookie.Expires = DateTime.Now.AddHours(1);
        Response.Cookies.Add(Cookie);
    }
}

2 个答案:

答案 0 :(得分:1)

我发现了一个稍微不同的请求,但这里需要类似的。我假设您的所有观点背后都有控制器操作。如果是这样,您可以添加一个自定义操作过滤器,为每个操作填充ViewBag。

编辑:我应该补充一点,您可以通过[CheckShownInterstitial]装饰将此过滤器应用于每个操作,或者将链接的答案注册为全局过滤器。

Embedded code in Razor _Layout.cshtml

如下所示

  public class CheckShownInterstitial : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        if (!filterContext.IsChildAction &&
            !filterContext.HttpContext.Request.IsAjaxRequest() &&
            filterContext.Result is ViewResult)
        {
            var ViewBag = filterContext.Controller.ViewBag;
            var Request = filterContext.HttpContext.Request;

            ViewBag.shownInterstitial = false;
            if (Request.Cookies["Interstitial"] != null)
            {
                ViewBag.shownInterstitial = true;
            }
            //Interstitial cookie does NOT exist.
            else
            {
                ViewBag.shownInterstitial = false;
            }
        }
    }
}

答案 1 :(得分:0)

一种方法是只创建一个@Html扩展来呈现div Request.Cookies["Interstitial"] != null

public static class DivExtensions
{
    public static string InterstitialAd(this HtmlHelper helper)
    {
        var html = string.Empty;
        if (HttpContext.Current.Request.Cookies["Interstitial"] == null)
        {
            html = "<div class='hidden-md hidden-lg'><div class='adnl_zone id_4034'></div></div>'";
            //Create a cookie to prevent interstitial spam.
            HttpCookie Cookie = new HttpCookie("Interstitial");
            Cookie.Value = "true";
            Cookie.Expires = DateTime.Now.AddHours(1);
            HttpContext.Current.Response.Cookies.Add(Cookie);
        }
        return html;

    }
}

然后在你看来你只需添加

@Html.InterstitialAd()

这是一段视频,可以帮助您了解如何创建自定义HTML帮助程序https://www.youtube.com/watch?v=2mACi5D739g