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?
由于
答案 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")
}