以下是我的Controller和View的摘要。我想从View中调用方法GetUserDistinguished。这只是化妆品。 Guid是丑陋的,对最终用户没有意义,但它是我为用户使用的唯一ID。
namespace Users.Controllers
{
public class UsersController : Controller
{
public ViewResult Index()
{
var users = db.Users.Include("Users");
return View(users.ToList());
}
public string GetUserDistinguished(string Guid)
{
return ADHelper.ConvertGuidToDn(Guid);
}
}
}
@model IEnumerable<Test.GuidToDistinguishedName>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
Name from Guid
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Guid)
</td>
</tr>
}
</table>
答案 0 :(得分:0)
视图不应该调用控制器。这打破了MVC模式。
相反,让控制器在将数据传递到视图之前对数据进行必要的修改,并使视图仅负责显示数据和获取新输入。
答案 1 :(得分:0)
根据您想要达到的目标,您可以采取两种方法:
如果您想在页面上显示Guids和Distinguished名称对,您应该将这些对的集合设置为视图的模型。
如果要在用户点击某个位置时向用户显示专有名称,则应添加一个接受guid的操作,并将其专有名称及其他所需数据设置为另一个视图的模型。
查看示例代码,我不确定您的方案是什么。
编辑:
根据您的评论,第一种方法是正确的:您需要为控制器中的视图准备所有数据并将其放入模型中。
您可以像这样修改Index
方法来设置guid和专有名称对(当然,如果需要传递更多数据,您可以随时使用自己的自定义类作为模型 - 甚至鼓励这样做) :
public ViewResult Index()
{
var users = db.Users.Include("Users").ToList();
var model = users.ToDictionary(u => u.Guid, u => GetUserDistinguished(u.Guid));
return View(model);
}
在视图中,您可以迭代这些对以在表格中显示它们:
<table>
<tr>
<th>
Guid
</th>
<th>
Name
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Key)
</td>
<td>
@Html.DisplayFor(modelItem => item.Value)
</td>
</tr>
}
</table>
在我的情况下,不要忘记在页面顶部设置正确的模型类型:
@model Dictionary<string, string>