Mvc ViewBag - Невозможно преобразовать значение null в 'bool', потому что это тип значения, который не является нулевым значением

Я хочу установить bool в 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)

UPDATE

Соответствующий код контроллера:

[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")
}

Частично ExternalLoginsList:

@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>
    }
}

Ответ 1

Try:

@if (ViewBag.IsRegistration == true)

Ответ 2

Я знаю, что это старый вопрос, но я думаю, что у меня элегантный ответ, поэтому, если кто-нибудь прочтет это после поиска, вот мой:

@if (ViewBag.IsRegistration ?? false)

Ответ 3

Просто проверьте null перед проверкой на true:

if (ViewBag.IsRegistration != null && ViewBag.IsRegistration)

Ответ 4

Хорошо, так как в предложениях Floods в комментариях мне нужно передать аргументы. ViewBag из родительского представления не переходит к частичным представлениям.

Итак, в коде для просмотра регистра мне нужно было изменить

 <section id="socialLoginForm">
       @Html.Action("ExternalLoginsList", new {ReturnUrl = ViewBag.ReturnUrl})
 </section>

to

<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()));
}

to

[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()));
}

Затем в ExternalLogins я могу просто:

@if (ViewBag.IsRegistering)

по мере необходимости.

Итак, я эффективно передаю команду IsRegistering bool от контроллера к главному виду, а затем вернусь к методу действий на контроллере, а затем в ViewBag, которые позволяют мне получить доступ к bool в дочернем частичном представлении.

Большое спасибо.

Ответ 5

Булевы в 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>
        }

Ответ 6

Попробуйте следующее:

Замените линию на контроллере:

ViewBag.IsRegistration = true;

с

ViewBag.IsRegistration = new bool?(true);

и замените строку в вашем представлении:

@if (ViewBag.IsRegistration)

с

@if ((ViewBag.IsRegistration as bool?).Value)

Эффективно вы помещаете нулевое значение bool в ViewBag и затем разворачиваете его.

Ответ 7

Попробуйте TempData вместо ViewBag.

Измените свой код из

контроллер

ViewBag.IsRegistration=true;

к

TempData["IsReg"]=true;

и в представлении

@if((bool)TempData["IsReg"])

Кажется, что вы используете значение в дочернем частичном представлении, и вы добавляете данные в родительское действие. Значения в viewbag не могут передавать данные из одного действия в вид действия других. В то время как TempData использует сеанс, он может использоваться для передачи данных одному действию в другое представление действий.

Ответ 8

Возможно так:

@if ((ViewBag.IsRegistration != null) && (ViewBag.IsRegistration is bool) && (bool)ViewBag.IsRegistration)
{
}