我想提供一个简单的常规功能,以便在需要通知用户操作成功时在页面顶部显示一条消息。
我的解决方案是将一个对象放入ViewBag.Info
中,其中包含有关消息的详细信息,包括bool public IsMessage;
,并在_Layout.cshtml
中读取它,而我还有一个额外的隐藏div
。
我尝试在_Layout.cshtml
中执行此操作的方法是,将@(ViewBag.Info.IsMessage
中的内容(false/true)放入隐藏字段中,然后通过JavaScript读取。如果该字段包含“true”,则javascript将调用函数ShowEvent()
。
由于某些原因,如果我添加@(ViewBag.Info.IsMessage.ToString().ToLower())
行,则VS2010会在ViewBag.Title
中提示_Layout.cshtml
。
_Layout.cshtml
的代码很简单:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<link rel="Stylesheet" type="text/css" href="@Url.Content("~/Content/StyleSheet.css")" />
<script src="~/Scripts/jquery-2.1.1.min.js" type="text/javascript"></script>
<title>@ViewBag.Title</title>
</head>
<body>
<input type="hidden" id="is-event" name="is-event" value="@(ViewBag.Info.IsMessage.ToString().ToLower())"/>
<div class="recent-events"></div>
<div>
@if (IsSectionDefined("loginfo"))
{
@RenderSection("loginfo", false)
}
@RenderBody()
@if (IsSectionDefined("Home"))
{
@RenderSection("Home", false)
}
</div>
</body>
</html>
View
Index.cshtml
的代码是:@model TestProject.ViewModels.Account.UserData
@{
ViewBag.Title = "Index";
string identityName = HttpContext.Current.User.Identity.Name;
string userrole = Model.UserRoles.FirstOrDefault();
}
<h2>Index</h2>
<br />
如您所见,
ViewBag.Title
已定义。编辑。
Controller 代码:
public ActionResult Index()
{
// ...
InfoModel infoModel = new InfoModel()
{
IsMessage = true, Duration = 3000, Message = "Logging in successfull", BackgroundColor = "#bbffbb"
};
ViewBag.Info = infoModel;
ViewBag.Title = string.Empty;
return View(userdata);
}
最佳答案
如果尝试从不是强类型的View引用模型,则会出现此问题。例如,输入
@Model.ID
页面中的某处将尝试绑定(bind)到ViewModel的ID属性-如果您尚未在View页面顶部定义模型类型,请使用
@model MyModel
那么它就会用这个晦涩的错误信息轰炸。
关于c# - 无法对空引用执行运行时绑定(bind)。 ViewBag.Title为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28147460/