переменная для отображения / скрытия ссылки в представлении ASP.NET MVC3 - PullRequest
0 голосов
/ 19 января 2012

Довольно новый для MVC3, и я делаю простой проект для целей тестирования. Поэтому я столкнулся с небольшой проблемой, о которой я хотел бы получить вашу помощь.

На данный момент у меня есть этот код: -

<p>
@if (UserCanCreate)
{
    @Html.ActionLink("Create New", "Create")
}

У меня вопрос, как я могу заполнить логическое значение UserCanCreate из моего контроллера? Я попытался создать свойство в контроллере, но представление по-прежнему не видит этого.

Может быть, есть лучший способ сделать это?

Спасибо за вашу помощь

ОБНОВЛЕНО с помощью ViewModel

@model IEnumerable<DBName.ViewModels.ProfileData>


@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.UserName)
    </td>
    <td>
        @Html.ActionLink("Details", "Details", new { id=item.FantaTeamID }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.FantaTeamID })
    </td>
</tr>

}

Как я могу заменить этот код сейчас? откуда взять item.UserName?

Спасибо

Ответы [ 4 ]

4 голосов
/ 19 января 2012

Есть как минимум два разных способа сделать это.

Первый (лучше) использует модель для передачи данных.Для этого вы должны создать класс Model:

//Model.cs
public class MyModel
{
    public bool UserCanCreate { get; set;}
}

и указать его в начале вашего представления (используйте типизированное представление):

@model %Your_model_namespace%.MyModel

...

<p>
@if (Model.UserCanCreate)
{
    @Html.ActionLink("Create New", "Create")
}

И, конечно же, в вашем контроллеревыполните следующие действия:

public ActionResult YourAction()
{
    ...
    MyModel model = new MyModel();
    model.UserCanCreate = ... ; // Determine if link shall be visible here
    ...
    return View(model);
}

Секунда (более быстрая, хотя и не рекомендуется): используйте коллекцию ViewData для передачи значений.

Например, в вашем действии контроллера выполните:

public ActionResult YourAction()
{
    ...
    ViewData["UserCanCreate"] = ... ; // Determine if link shall be visible here
    ...
    return View();
}

, и ваш взгляд будет выглядеть так:

...

<p>
@if ((bool)ViewData["UserCanCreate"])
{
    @Html.ActionLink("Create New", "Create")
}

Также важно : есливы пытаетесь таким образом обезопасить некоторые действия, затем не забудьте добавить некоторые проверки разрешений в код действия «Создать» - иначе любой пользователь сможет выполнить его, просто введя соответствующий URL-адрес в адресную строку браузера - даже если ActionLinkотсутствует.

ОБНОВЛЕНИЕ

Что касается вашего комментария - вы, кажется, смешиваете доменные модели с моделями представления.Модели предметной области - это те, которые представляют сущности вашей базы данных, а модели представлений - те, которые следует использовать для представления.Обычно задачей контроллера является преобразование объектов из домена для просмотра моделей и наоборот.

В вашем случае EF-модели - это доменные модели.

Для ViewModel вы должны создать отдельный класс, который будет агрегировать ваш экземпляр модели домена и любые дополнительные свойства, которые вы хотите - например, UserCanCreate.

Пример класса модели:

public class UsersViewModel
{
    public IEnumerable<DBName.Models.Users> Users { get; set; }
    public bool UserCanCreate { get; set; }
    ... // Any other additional properties you may require
}

В вашем контроллере это будет:

public ActionResult YourAction()
{
    ...
    UsersViewModel model = new UsersViewModel();
    model.Users = ... ; // Get your IEnumerable<DBName.Models.Users> collection from DB and assign it to model property here
    model.UserCanCreate = ... ; // Determine if link shall be visible here
    ...
    return View(model);
}

и в поле зрения:

@model %Your_model_namespace%.UsersViewModel

... // use Model.Users wherever you need your IEnumerable<DBName.Models.Users>

<p>
@if (Model.UserCanCreate)
{
    @Html.ActionLink("Create New", "Create")
}
0 голосов
/ 19 января 2012

Ваш вид должен взаимодействовать с контроллером, используя модель. Таким образом, вы должны создать строго типизированный View и передать ему экземпляр Model. Например:

// ViewModel
public class MyViewModel
{
     public bool UserCanCreate{get;set;}
}

// Controller
public class MyController : Controller
{
     public ActionResult Index()
     {
          var model = new MyViewModel
          {
              UserCanCreate = _permissionService.Authorize(StandardPermissionProvider.AccessAdminPanel)
          };
          return View(model);
     }

     // Other Actions goes here....
}

// View
<p>
@if (Model.UserCanCreate)
{
    @Html.ActionLink("Create New", "Create")
}
0 голосов
/ 19 января 2012

При создании модели установите значение

UserCanCreate = _permissionService.Authorize(StandardPermissionProvider.AccessAdminPanel),
0 голосов
/ 19 января 2012

Ваше представление должно иметь модель, например, UserModel.

Добавьте логическое свойство UserCanCreate в UserModel, и вы сможете получить к нему доступ.

Например:

namespace MvcApplication1.Models
{
    public class UserModel
    {
        public bool UserCanCreate { get; set; }
    }
}

и используйте его в представлении:

@model MvcApplication1.Models.UserModel

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
</head>
<body>
    <div>
        @Model.UserCanCreate
    </div>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...