16 Stimmen

Mvc ViewBag - Kann 'null' nicht in 'bool' konvertieren, da es sich um einen nicht-nullable Werttyp handelt

Ich möchte in der Controller einen bool auf true setzen, wenn eine bestimmte Ansicht erzeugt wird, und dann den Header der Ansicht entsprechend ändern. Das sollte eigentlich ganz einfach sein, aber stattdessen bekomme ich folgende Fehlermeldung:

Kann bei einer NULL-Referenzbindung zur Laufzeit nicht ausgeführt werden. Ausnahmedetails: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Kann bei einer NULL-Referenzbindung zur Laufzeit nicht ausgeführt werden

Alles was ich im Controller mache, ist:

[AllowAnonymous]
public ActionResult Register()
{
    ViewBag.IsRegistration = true;
    return View();
}

und dann in der Ansicht:

@if (ViewBag.IsRegistration)
{
    Registrieren Sie sich mit einem anderen Dienst.
}
else
{
    Verwenden Sie einen anderen Dienst, um sich anzumelden.
}

aber es schlägt fehl bei:

@if (ViewBag.IsRegistration)

UPDATE

Relevanter Controller-Code:

[AllowAnonymous]
public ActionResult Register()
{
    ViewBag.IsRegistration = "true";
    return View();
}

Die Registrierungsansicht:

@model Mvc.Models.RegisterViewModel
@{
     Layout = "~/Views/Shared/_AccountLayout.cshtml";
     ViewBag.Title = "Register";
}

    @ViewBag.Title.

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary()

            Neues Konto erstellen.

                @Html.LabelFor(m => m.UserName, new { @class = "control-label" })

                    @Html.TextBoxFor(m => m.UserName)

                @Html.LabelFor(m => m.Password, new { @class = "control-label" })

                    @Html.PasswordFor(m => m.Password)

                @Html.LabelFor(m => m.ConfirmPassword, new { @class = "control-label" })

                    @Html.PasswordFor(m => m.ConfirmPassword)

    }

            @Html.Action("ExternalLoginsList", new { ReturnUrl = ViewBag.ReturnUrl })

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Das ExternalLoginsList-Teil:

@using Glimpse.Core.Extensions
@using Microsoft.Owin.Security
@model ICollection

@if (Model.Count == 0)
{

        Es sind keine externen Authentifizierungsdienste konfiguriert

}
else
{
    using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = ViewBag.ReturnUrl }))
    {
    @Html.AntiForgeryToken()

            @if (!string.IsNullOrEmpty(ViewBag.IsRegistration))
            {
            Registrieren Sie sich mit einem anderen Dienst.
            }
            else
            {
            Verwenden Sie einen anderen Dienst, um sich anzumelden.
            }

                @foreach (AuthenticationDescription p in Model) {
                    @p.AuthenticationType
                }

    }
}

1voto

Imran Punkte 504

Versuchen Sie TempData anstelle von ViewBag.

Ändern Sie Ihren Code von

Controller

ViewBag.IsRegistration=true;

zu

TempData["IsReg"]=true;

und in der View

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

Es scheint, dass Sie den Wert in einer untergeordneten Teile-Ansicht verwenden und die Daten in der Elternaktion hinzufügen. Die Werte im ViewBag können keine Daten von einer Aktion an die Ansicht einer anderen Aktion übergeben. TempData verwendet eine Sitzung und kann daher verwendet werden, um Daten von einer Aktion an die Ansicht einer anderen Aktion zu übergeben.

0voto

Flood Gravemind Punkte 3625

Booleans im Viewbag sind immer heikel. Versuchen Sie stattdessen dies

[AllowAnonymous]
        public ActionResult Register()
        {
            ViewBag.Registration = "x";//x oder was auch immer
            return View();
        }

@if (!String.IsNullorEmpty(ViewBag.Registration))
        {
        Registrieren Sie sich über einen anderen Dienst.
        }
        else
        {
        Verwenden Sie einen anderen Dienst zum Einloggen.
        }

0voto

Spartak N. Punkte 1

Vielleicht so:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X