Ответ 1
Try:
@if (ViewBag.IsRegistration == true)
Я хочу установить 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>
}
}
Try:
@if (ViewBag.IsRegistration == true)
Я знаю, что это старый вопрос, но я думаю, что у меня элегантный ответ, поэтому, если кто-нибудь прочтет это после поиска, вот мой:
@if (ViewBag.IsRegistration ?? false)
Просто проверьте null
перед проверкой на true
:
if (ViewBag.IsRegistration != null && ViewBag.IsRegistration)
Хорошо, так как в предложениях 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 в дочернем частичном представлении.
Большое спасибо.
Булевы в 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>
}
Попробуйте следующее:
Замените линию на контроллере:
ViewBag.IsRegistration = true;
с
ViewBag.IsRegistration = new bool?(true);
и замените строку в вашем представлении:
@if (ViewBag.IsRegistration)
с
@if ((ViewBag.IsRegistration as bool?).Value)
Эффективно вы помещаете нулевое значение bool в ViewBag и затем разворачиваете его.
Попробуйте TempData вместо ViewBag.
Измените свой код из
контроллер
ViewBag.IsRegistration=true;
к
TempData["IsReg"]=true;
и в представлении
@if((bool)TempData["IsReg"])
Кажется, что вы используете значение в дочернем частичном представлении, и вы добавляете данные в родительское действие. Значения в viewbag не могут передавать данные из одного действия в вид действия других. В то время как TempData использует сеанс, он может использоваться для передачи данных одному действию в другое представление действий.
Возможно так:
@if ((ViewBag.IsRegistration != null) && (ViewBag.IsRegistration is bool) && (bool)ViewBag.IsRegistration)
{
}