Mvc ViewBag - Impossible de convertir null en 'bool' car il s'agit d'un type de valeur non nullable
Je veux mettre un booléen à true dans le contrôleur lors de la production d'un certain point de vue, puis de modifier l'en-tête de la vue en conséquence. Cela devrait être simple, mais au lieu de cela Im obtenir:
Ne peut pas effectuer la liaison de runtime sur une référence null Détails de l'Exception:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Impossible d'effectuer
la liaison de runtime sur une référence null
Tous les Im faire est de contrôleur:
[AllowAnonymous]
public ActionResult Register()
{
ViewBag.IsRegistration = true;
return View();
}
et puis, en vue:
@if (ViewBag.IsRegistration)
{
<legend>Register using another service.</legend>
}
else
{
<legend>Use another service to log in.</legend>
}
mais il échoue sur:
@if (ViewBag.IsRegistration)
Mise à JOUR
Pertinentes Du Code De Contrôleur:
[AllowAnonymous]
public ActionResult Register()
{
ViewBag.IsRegistration = "true";
return View();
}
Le registre de vue:
@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")
}
La ExternalLoginsList partielle:
@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>
}
}
source d'informationauteur rism
Vous devez vous connecter pour publier un commentaire.
Essayer:
Je sais que c'est une vieille question, mais je pense que j'ai un élégant la réponse, donc si quelqu'un lit cet après recherche, voici la mienne:
Vérifier simplement
null
avant de vérifiertrue
:Ok ainsi que par les Inondations de la suggestion dans les commentaires, j'ai besoin de passer les arguments autour de. Le ViewBag de la Vue parent ne s'écoule pas à travers des vues partielles.
Donc dans le code de la Vue Register j'avais besoin de changer de
à
Ensuite, allez dans mon compte contrôleur et le changement à partir de:
à
Puis dans le ExternalLogins je peux juste:
que nécessaire.
Donc Im efficacement en passant la IsRegistering bool de contrôleur de l'écran principal puis retour jusqu'à la méthode d'action sur le contrôleur puis dans le ViewBag qui me permettent d'accéder à l'bool, chez l'enfant, vue partielle.
Merci beaucoup.
Les booléens en Viewbag sont toujours un sujet délicat. Essayez plutôt ceci
Essayez ceci:
Remplacer la ligne de votre contrôleur:
avec
et remplacez la ligne de votre point de vue:
avec
Effectivement vous mettez un nullable bool dans le ViewBag et puis déballage.
Essayer TempData au lieu de ViewBag.
Modifier votre code de
Contrôleur
à
et en Vue
Il me semble que vous êtes à l'aide de la valeur de l'enfant vue partielle et que vous ajoutez des données dans le parent de l'action.Les valeurs dans viewbag ne peut pas passer des données d'une action à anothers vue de l'action. Alors que TempData session d'utilisation il peut être utilisé pour transmettre des données à une action à une autre vue actions.
Peut-être: