16

我想在生成某个视图时在控制器中将 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)

更新

相关控制器代码:

[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>
    }
}
4

8 回答 8

59

尝试:

@if (ViewBag.IsRegistration == true)
于 2013-10-23T22:31:25.903 回答
21

我知道这是一个老问题,但我想我有一个优雅的答案,所以如果有人在搜索后读到这个,这是我的:

@if (ViewBag.IsRegistration ?? false)
于 2015-09-09T17:09:14.057 回答
1

尝试这个:

更换控制器中的线路:

ViewBag.IsRegistration = true;

ViewBag.IsRegistration = new bool?(true);

并替换您视图中的行:

@if (ViewBag.IsRegistration)

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

实际上,您在 ViewBag 中放置了一个可为空的 bool,然后将其展开。

于 2013-10-23T22:48:57.547 回答
1

只需null在检查之前检查true

if (ViewBag.IsRegistration != null && ViewBag.IsRegistration)
于 2013-10-23T22:49:01.830 回答
1

好的,根据评论中的洪水建议,我需要传递论点。来自父视图的 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()));
}

然后在 ExternalLogins 我可以:

@if (ViewBag.IsRegistering)

有必要的。

所以我有效地将 IsRegistering bool 从控制器传递到主视图,然后备份到控制器上的操作方法,然后进入 ViewBag,这允许我访问子部分视图中的 bool。

非常感谢。

于 2013-10-23T23:57:58.223 回答
1

尝试使用 TempData 而不是 ViewBag。

更改您的代码

控制器

ViewBag.IsRegistration=true;

TempData["IsReg"]=true;

并在视图中

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

似乎您正在使用子部分视图中的值,并且正在将数据添加到父操作中。viewbag 中的值无法将数据从一个操作传递到另一个操作的视图。虽然 TempData 使用会话,但它可用于将数据传递给一个操作到另一个操作视图。

于 2013-11-25T17:52:50.103 回答
0

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>
        }
于 2013-10-23T22:30:13.913 回答
0

可能是这样:

@if ((ViewBag.IsRegistration != null) && (ViewBag.IsRegistration is bool) && (bool)ViewBag.IsRegistration)
{
}
于 2015-09-02T18:52:28.303 回答