ASP. Net MVC ViewBag не работает в View. Результат ViewBag правильный - PullRequest
0 голосов
/ 11 февраля 2020

У меня проблема с ViewBag, не работающим в поле зрения. Контроллер возвращает то, что мне нужно ..

При отладке у меня Current = false, а затем при просмотре результатов у меня тоже false. Бит установлен в ложь. Кажется, что все элементы ViewBag возвращают False для Current.

Когда я вызываю ViewBag в моем View, он, похоже, ничего не делает. Это тоже не вина.

Вот мой раздел кода, где я получаю текущую информацию о bool из массива.

 if (GetOrPost == "GET")
 {
    if (actionName == "add" || actionName == "index" || actionName == "create" || actionName == "edit" || actionName == "delete" || actionName == "multiviewindex")
    {
      ViewBag.Add = menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsAdd));
      ViewBag.Read = menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsRead));
      ViewBag.Create = menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsCreate));
      ViewBag.Edit = menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsUpdate));
      ViewBag.Delete = menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsDelete));
    }
  }

Это использование в представлении:

  @if (ViewBag.Edit = true)
  {
     @Ajax.ModalDialogActionLink("Edit", "Edit", "Edit User", "btn btn-warning btn-sm", new { UserName = item.UserName })
  }

MenuOfRole возвращает все разрешения для входа в RoleUser. В зависимости от контроллера и действия я могу извлечь то, что я нужно, где я нахожусь.

Любые идеи о том, почему он не работает в представлении. А также, если есть более простой и понятный способ сделать это - у меня все уши!

Спасибо

ОБНОВЛЕНИЕ: Я сделал проверку в представлении - просто вернул ViewBag, и это возвращаясь к истине, но в Контроллере говорится, что это ложь. Я не уверен, почему это так. Если ViewBag установлен в контроллере как false Он должен отображаться в представлении как false, не так ли?

Редактировать: По запросу вот мой ForEach l oop.

<tbody>
   @foreach (var item in Model)
   {
     <tr>
        <td>
            @Html.DisplayFor(modelItem => item.UserName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Email)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Role)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LockoutEndDateUtc)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CompanyName)
        </td>
        <td>

          @if (ViewBag.Edit == true)
          {
             @Ajax.ModalDialogActionLink("Edit", "Edit", "Edit User", "btn btn-warning btn-sm", new { UserName = item.UserName })
          }
          @if (User.IsInRole("Administrator"))
          {
             @Ajax.ModalDialogActionLink("PW Reset", "SendResetPassword", "Account", "Reset Password", "btn btn-info btn-sm", new { UserName = item.UserName })
             <text>&nbsp;</text>
             @Ajax.ModalDialogActionLink("Conf E-Mail", "SendEmailConfirm", "Account", "Email Confirmation", "btn btn-info btn-sm", new { UserName = item.UserName })
          }
          @if ((item.UserName.ToLower() != this.User.Identity.Name.ToLower()))
          {
            if (ViewBag.Delete == true)
            {
               @Html.ActionLink("Delete", "Delete", null, new { UserName = item.UserName },
               new { onclick = "return Confirm('Are you sure you want to delete this user?');", @class = "btn btn-danger btn-sm" })
             }
             <div class="btn-group">
                 @Html.ActionLinkAuthorized("Edit Roles", "Edit", "Roles", new { UserName = item.UserName }, new { @class = "btn btn-warning btn-sm" }, true)
             </div>
         }
        </td>
     </tr>
    }
 </tbody>

Обновление: полный ответ на этот go на этот пост.

stackoverflow.com / Вопросы / 60173428 /

1 Ответ

0 голосов
/ 11 февраля 2020

следующая строка возвращает коллекцию логических значений:

menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsUpdate));

итак, ViewBag.Edit (то же самое объяснение для других, которые назначены ViewBag)

Именно поэтому @if (ViewBag.Edit = true) оценивается неправильно.

Чтобы исправить это, измените раздел кода для использования FirstOrDefault (), чтобы он возвращал только один элемент из коллекции в контроллере следующим образом:

if (GetOrPost == "GET")
 {
    if (actionName == "add" || actionName == "index" || actionName == "create" || actionName == "edit" || actionName == "delete" || actionName == "multiviewindex")
    {
      ViewBag.Add = menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsAdd)).FirstOrDefault();
      ViewBag.Read = menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsRead)).FirstOrDefault();
      ViewBag.Create = menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsCreate)).FirstOrDefault();
      ViewBag.Edit = menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsUpdate)).FirstOrDefault();
      ViewBag.Delete = menuaccess.Where(i => i.MenuURL == controllerName).Select(i => (i.IsDelete)).FirstOrDefault();
    }
  }

Обратите внимание, я Рекомендуется использовать FirstOrDefault () при условии, что коллекция будет содержать одно и то же значение. То же, что я имел в виду под одним и тем же значением / с, - это коллекция, содержащая либо все true, либо все false, но не сочетание true и false

Если ваша коллекция содержит как true, так и false, вам нужно использовать Any следующим образом:

if (GetOrPost == "GET")
{
    if (actionName == "add" || actionName == "index" || actionName == "create" || actionName == "edit" || actionName == "delete" || actionName == "multiviewindex")
    {
      ViewBag.Add = menuaccess.Any(i => i.MenuURL == controllerName && i.IsAdd);
      ViewBag.Read = menuaccess.Any(i => i.MenuURL == controllerName && i.IsRead);
      ViewBag.Create = menuaccess.Any(i => i.MenuURL == controllerName && i.IsCreate);
      // Any will be evaluated to true if any of item's MenuURL is equal to controllerName and IsUpdate set to true. false will be returned otherwise. Same explanation for others as well.
      ViewBag.Edit = menuaccess.Any(i => i.MenuURL == controllerName && i.IsUpdate);
      ViewBag.Delete = menuaccess.Any(i => i.MenuURL == controllerName && i.IsDelete);
    }
}
...