处理以下情况的最佳方法是什么?我的_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);
}
}
答案 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