0

下面是我的控制器和视图的摘要。我想从视图中调用 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>
4

2 回答 2

0

视图不应调用控制器。这打破了 MVC 模式。

相反,让您的控制器在将数据传递到视图之前对数据进行任何必要的修改,并让视图只负责数据的显示和新输入的获取。

于 2012-10-26T19:10:56.693 回答
0

根据您想要实现的目标,您可以采用两种方法:

  1. 如果你想在页面上显示成对的 Guid 和 Distinguished 名字,你应该只设置这些对的集合作为视图的模型。

  2. 如果您想在用户单击某处时向用户显示一个专有名称,您应该添加一个接受该 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>
于 2012-10-26T19:15:42.020 回答