Mvc ViewBag - 无法将 null 转换为 'bool',因为它是不可为空的值类型
本文关键字:类型 因为 转换 null bool Mvc ViewBag | 更新日期: 2023-09-27 18:36:42
我想在生成某个视图时在控制器中将布尔值设置为 true,然后相应地更改视图的标题。这应该非常简单,但相反,我得到:
无法对空引用执行运行时绑定 异常详细信息: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法执行 空引用上的运行时绑定
我所做的只是在控制器中:
[AllowAnonymous]
public ActionResult Register()
{
ViewBag.IsRegistration = true;
return View();
}
然后在视图中:
@if (ViewBag.IsRegistration)
{
<legend>Register using another service.</legend>
}
else
{
<legend>Use another service to log in.</legend>
}
但它在以下方面失败:
@if (ViewBag.IsRegistration)
更新
相关控制器代码:
[AllowAnonymous]
public ActionResult Register()
{
ViewBag.IsRegistration = "true";
return View();
}
寄存器视图:
@model Mvc.Models.RegisterViewModel
@{
Layout = "~/Views/Shared/_AccountLayout.cshtml";
ViewBag.Title = "Register";
}
<hgroup class="title">
<h1>@ViewBag.Title.</h1>
</hgroup>
<div class="row">
<div class="col-lg-6">
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
<fieldset class="form-horizontal">
<legend>Create a new account.</legend>
<div class="control-group">
@Html.LabelFor(m => m.UserName, new { @class = "control-label" })
<div class="controls">
@Html.TextBoxFor(m => m.UserName)
</div>
</div>
<div class="control-group">
@Html.LabelFor(m => m.Password, new { @class = "control-label" })
<div class="controls">
@Html.PasswordFor(m => m.Password)
</div>
</div>
<div class="control-group">
@Html.LabelFor(m => m.ConfirmPassword, new { @class = "control-label" })
<div class="controls">
@Html.PasswordFor(m => m.ConfirmPassword)
</div>
</div>
<div class="form-actions no-color">
<input type="submit" value="Register" class="btn" />
</div>
</fieldset>
}
</div>
<div class="col-lg-6"></div>
<section id="socialLoginForm">
@Html.Action("ExternalLoginsList", new { ReturnUrl = ViewBag.ReturnUrl })
</section>
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
外部登录列表部分:
@using Glimpse.Core.Extensions
@using Microsoft.Owin.Security
@model ICollection<AuthenticationDescription>
@if (Model.Count == 0)
{
<div class="message-info">
<p>There are no external authentication services configured</p>
</div>
}
else
{
using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = ViewBag.ReturnUrl }))
{
@Html.AntiForgeryToken()
<fieldset id="socialLoginList">
@if (!string.IsNullOrEmpty(ViewBag.IsRegistration))
{
<legend>Register using another service.</legend>
}
else
{
<legend>Use another service to log in.</legend>
}
<p>
@foreach (AuthenticationDescription p in Model) {
<button type="submit" class="btn" id="@p.AuthenticationType" name="provider" value="@p.AuthenticationType" title="Log in using your @p.Caption account">@p.AuthenticationType</button>
}
</p>
</fieldset>
}
}
尝试:
@if (ViewBag.IsRegistration == true)
我知道这是一个古老的问题,但我认为我有一个优雅的答案,所以如果有人在搜索后阅读本文,这是我的:
@if (ViewBag.IsRegistration ?? false)
试试这个:
更换控制器中的行:
ViewBag.IsRegistration = true;
跟
ViewBag.IsRegistration = new bool?(true);
并替换视图中的行:
@if (ViewBag.IsRegistration)
跟
@if ((ViewBag.IsRegistration as bool?).Value)
实际上,您将一个可为空的布尔值放入ViewBag中,然后将其解开。
只需在检查true
之前检查null
:
if (ViewBag.IsRegistration != null && ViewBag.IsRegistration)
尝试 TempData 而不是 ViewBag。
将代码从
控制器
ViewBag.IsRegistration=true;
自
TempData["IsReg"]=true;
并在视图中
@if((bool)TempData["IsReg"])
您似乎正在使用子分部视图中的值,并且正在父操作中添加数据。viewbag 中的值无法将数据从一个操作传递到另一个操作的视图。当 TempData 使用会话时,它可用于将数据传递到一个操作到另一个操作视图。
好的,所以根据评论中的洪水建议,我需要传递参数。父视图的 ViewBag 不会流向分部视图。
所以在寄存器视图的代码中,我需要从
<section id="socialLoginForm">
@Html.Action("ExternalLoginsList", new {ReturnUrl = ViewBag.ReturnUrl})
</section>
自
<section id="socialLoginForm">
@Html.Action("ExternalLoginsList",
new {ReturnUrl = ViewBag.ReturnUrl,
IsRegistering = @ViewBag.IsRegistering })
</section>
然后进入我的帐户控制器并从:
[AllowAnonymous]
[ChildActionOnly]
public ActionResult ExternalLoginsList(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return (ActionResult)PartialView("_ExternalLoginsListPartial", new List<AuthenticationDescription>(AuthenticationManager.GetExternalAuthenticationTypes()));
}
自
[AllowAnonymous]
[ChildActionOnly]
public ActionResult ExternalLoginsList(string returnUrl, string isRegistering) {
ViewBag.IsRegistering = (isRegistering.ToLower() == "true");
ViewBag.ReturnUrl = returnUrl;
return (ActionResult)PartialView("_ExternalLoginsListPartial", new List<AuthenticationDescription>(AuthenticationManager.GetExternalAuthenticationTypes()));
}
然后在外部登录中,我只能:
@if (ViewBag.IsRegistering)
必要时。
所以我有效地将 IsRegister 布尔值从控制器传递到主视图,然后返回到控制器上的操作方法,然后进入 ViewBag,这允许我访问子部分视图中的布尔值。
非常感谢。
Viewbag 中的布尔值总是很棘手。试试这个
[AllowAnonymous]
public ActionResult Register()
{
ViewBag.Registration = "x";//x or whatever
return View();
}
@if (!String.IsNullorEmpty(ViewBag.Registration))
{
<legend>Register using another service.</legend>
}
else
{
<legend>Use another service to log in.</legend>
}
也许是这样:
@if ((ViewBag.IsRegistration != null) && (ViewBag.IsRegistration is bool) && (bool)ViewBag.IsRegistration)
{
}