来自View的ASP.NET MVC3调用控制器方法

时间:2012-10-26 19:08:33

标签: asp.net-mvc-3 view

以下是我的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>

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

根据您想要达到的目标,您可以采取两种方法:

  1. 如果您想在页面上显示Guids和Distinguished名称对,您应该将这些对的集合设置为视图的模型。

  2. 如果要在用户点击某个位置时向用户显示专有名称,则应添加一个接受guid的操作,并将其专有名称及其他所需数据设置为另一个视图的模型。

  3. 查看示例代码,我不确定您的方案是什么。

    编辑:

    根据您的评论,第一种方法是正确的:您需要为控制器中的视图准备所有数据并将其放入模型中。

    您可以像这样修改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>