如何在每个循环中删除Asp.Net MVC中的命名空间?

时间:2011-07-28 11:29:19

标签: c# asp.net-mvc

我指的是其中一个示例,在它的aspx页面上,这段代码写的是:

<% foreach (KandaAlpha.Domain.Model.Entities.Customer customer in (List<KandaAlpha.Domain.Model.Entities.Customer>)(ViewData["Customers"]))
       { %>
    <tr>
        <td>
            <%= customer.CustomerID%>
        </td>
        <td>
            <%=customer.FullName%>
        </td>
        <td>
            <%=customer.LastUpdatedOn.ToString()%>
        </td>        
    </tr>
    <% } %>

如何将KandaAlpha.Domain.Model.Entities.Customer写入客户?我应该在哪里编写import namespace代码?

提前致谢:)

2 个答案:

答案 0 :(得分:4)

在视图的开头使用<%@ Import语句:

<%@ Import Namespace="KandaAlpha.Domain.Model.Entities" %>

或者通过将名称空间添加到web.config的<namespaces>部分,在这种情况下,它将是所有视图的全局:

<pages>
  <namespaces>
    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="KandaAlpha.Domain.Model.Entities"/>
  </namespaces>
</pages>

或者我推荐你的最佳方法是摆脱ViewData并使用视图模型和显示模板。在这种情况下,您的整个foreach循环将消失,并将替换为以下一个衬垫:

<table>
    <%= Html.DisplayFor(x => x.Customers) %>
</table>

然后在相应的显示模板(~/Views/Shared/DisplayTemplates/Customer.ascx)内定义客户的模板,该模板将为视图模型的Customers集合的每个元素呈现:

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<Customer>" 
%>
<tr>
    <td><%= Html.DisplayFor(x => x.CustomerID) %></td>
    <td><%= Html.DisplayFor(x => x.FullName) %></td>
    <td><%= Html.DisplayFor(x => x.LastUpdatedOn) %></td>
</tr>

另请注意Html.DisplayFor的使用情况,因为如果您的客户FullName为<script>alert('I hacked you');</script>,您可能会遇到麻烦,因为您没有对其进行HTML编码。

正如您所看到的,一旦我们摆脱ViewData并开始使用视图模型,我总是建议我们的视图变得非常简单和可读。

答案 1 :(得分:0)

<%@ Page Title="" Language="C#" MasterPageFile="~/Themes/Whatever/Site.Master" Inherits="System.Web.Mvc.ViewPage<Whatever.ViewModels.MyViewModel>" %>
<%@ Import Namespace="KandaAlpha.Domain.Model.Entities" %>
<%= //content %>