变量显示/隐藏ASP.NET MVC3视图中的链接

时间:2012-01-19 11:45:43

标签: asp.net-mvc asp.net-mvc-3

MVC3相当新,我正在做一个简单的测试项目。所以我遇到了一个小问题,我希望你帮忙。

目前我有这个代码: -

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

我的问题是,如何从控制器中填充布尔值UserCanCreate?我尝试在Controller中创建一个属性,但View仍然没有看到这个。

是否有更好的方法可以做到这一点?

感谢您的帮助

使用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 个答案:

答案 0 :(得分:4)

至少有两种不同的方法可以做到。

第一个(更好的一个)是使用模型传递数据。为此,您应该创建一个Model类:

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

并在View的开头指定它(使用类型化视图):

@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")
}

答案 1 :(得分:0)

您的视图必须具有模型,例如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>

答案 2 :(得分:0)

创建模型时,请设置值

UserCanCreate = _permissionService.Authorize(StandardPermissionProvider.AccessAdminPanel),

答案 3 :(得分:0)

您的视图应使用模型与Controller进行交互。因此,您应该创建一个强类型视图并将其传递给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")
}