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
                }

    }
}

61voto

acfrancis Punkte 3569

Versuche:

@if (ViewBag.IsRegistration == true)

23voto

jfren484 Punkte 920

Ich weiß, dass dies eine alte Frage ist, aber ich glaube, ich habe eine elegante Antwort, also falls jemand dies liest nachdem er gesucht hat, hier ist meine:

@if (ViewBag.IsRegistration ?? false)

1voto

Boluc Papuccuoglu Punkte 2273

Versuchen Sie dies:

Ersetzen Sie die Zeile in Ihrem Controller:

ViewBag.IsRegistration = true;

mit

ViewBag.IsRegistration = new bool?(true);

und ersetzen Sie die Zeile in Ihrer Ansicht:

@if (ViewBag.IsRegistration)

mit

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

Sie legen effektiv einen nullable bool im ViewBag ab und entpacken ihn dann.

1voto

Nenad Punkte 22188

Überprüfen Sie einfach null, bevor Sie true überprüfen:

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

1voto

rism Punkte 11523

Also wie von Floods Vorschlag in den Kommentaren, muss ich die Argumente weitergeben. Das ViewBag aus der übergeordneten Ansicht wird nicht an Teilansichten weitergeleitet.

Also im Code für die Registrierungsansicht musste ich von

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

zu

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

Dann gehe ich in meinen Account Controller und ändere von:

[AllowAnonymous]
[ChildActionOnly]
public ActionResult ExternalLoginsList(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return (ActionResult)PartialView("_ExternalLoginsListPartial", new List(AuthenticationManager.GetExternalAuthenticationTypes()));
}

zu

[AllowAnonymous]
[ChildActionOnly]
public ActionResult ExternalLoginsList(string returnUrl, string isRegistering) {
   ViewBag.IsRegistering = (isRegistering.ToLower() == "true");
   ViewBag.ReturnUrl = returnUrl;
   return (ActionResult)PartialView("_ExternalLoginsListPartial", new List(AuthenticationManager.GetExternalAuthenticationTypes()));
}

Dann in den ExternalLogins kann ich einfach:

@if (ViewBag.IsRegistering)

wie nötig.

Also übergebe ich effektiv den IsRegistering-Bool von Controller an Hauptansicht und dann wieder zurück zur Aktionsmethode im Controller und dann in ViewBag, was es mir ermöglicht, auf den Bool in der untergeordneten Teilansicht zuzugreifen.

Vielen Dank.

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