【问题标题】:Why can't an ASP.NET MVC strongly typed view use an interface?为什么 ASP.NET MVC 强类型视图不能使用接口?
【发布时间】:2009-11-04 13:25:58
【问题描述】:

为什么我不能使用这个接口来创建强类型视图?

public interface IAmAnAsset
{
    int assetID { get; }
    String assetTag { get; set; }
    int? AddedBy { get; set; }
    DateTime addedDate { get; set; }
    int? LocationId { get; set; }
    DateTime? purchasedDate { get; set; }
    int? purchasedby { get; set; }
    DateTime? disposalDate { get; set; }
    int assetModelId { get; set; }
    int? employeeId { get; set; }
    float? depreciated { get; set; }
    IAmAComputer Computer { get;  }
}

当我将那个确切的项目转换为抽象类时,它可以让我创建一个强类型视图。

我是新手,但我想我缺少一些东西,ASP.NET MVC 可以使用接口,对吧?

这是我试图用来创建强类型视图的持久层中的特定类。

public class ModelAsset : BufferedLinqEntity2<LqGpsDataContext, asset>, AssetManagementModel.IAmAnAsset
{
...
}

我正在尝试创建我的第一个 MVC 视图。

【问题讨论】:

  • ASP.NET MVC 确实支持使用接口的强类型视图。你有什么特别的问题?
  • 我不能有一个数据层类来继承一些基于数据的行为,同时实现我想在视图上显示的模型层接口。
  • 我想你可能误读了达林的评论。 ASP.NET MVC DOES 支持接口。请用抽象类和母版页sn-p详细说明?谢谢。
  • 有关在 ASP.Net MVC 中实现强类型视图的更多信息,请参阅 this blog post
  • @Dan 它支持接口作为强类型视图的来源吗?

标签: asp.net-mvc


【解决方案1】:

ASP.NET 与接口完美配合:

public interface IAmAnAsset
{
    int AssetID { get; set; }
}

public class AmAnAsset : IAmAnAsset
{
    public int AssetID { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        IAmAnAsset model = new AmAnAsset { AssetID = 10  };
        return View(model);
    }
}

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IAmAnAsset>" %>

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
    <p><%= Model.AssetID %></p>
</asp:Content>

【讨论】:

  • 当我去创建视图时,我的控制器没有被列为强类型视图的源?
  • 如何创建视图?我从未使用过 ASP.NET MVC 向导来添加强类型视图。也许您的接口模型类型未在组合框中列出?如果是这种情况,只需像我在示例中所做的那样手动创建您的视图。
  • 你的意思是你的INTERFACE没有列出来?没关系,只需在您的视图中手动替换 Inherits 模板指令即可。
  • @Maslow 为什么你的控制器会成为视图的源类型?
  • 在控制器中创建视图不违反mvc的全部要点吗?将事物分成不同的层?
【解决方案2】:

所以我最终要做的是暂时将 IAmAnAsset 更改为一个足够长的抽象类,以便 Create View 下拉菜单可用,使用它来创建 View,然后将其切换回来,以便持久性/数据库层再次编译.

这是它为我生成的:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<AssetManagementModel.IAmAnAsset>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Assets
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>ListAll</h2>

<table>
    <tr>
        <th></th>
        <th>
            assetID
        </th>
        <th>
            assetTag
        </th>
        <th>
            AddedBy
        </th>
        <th>
            addedDate
        </th>
        <th>
            LocationId
        </th>
        <th>
            purchasedDate
        </th>
        <th>
            purchasedby
        </th>
        <th>
            disposalDate
        </th>
        <th>
            assetModelId
        </th>
        <th>
            employeeId
        </th>
        <th>
            depreciated
        </th>
    </tr>

<% foreach (var item in Model) { %>

    <tr>
        <td>
            <%= Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) %> |
            <%= Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ })%>
        </td>
        <td>
            <%= Html.Encode(item.assetID) %>
        </td>
        <td>
            <%= Html.Encode(item.assetTag) %>
        </td>
        <td>
            <%= Html.Encode(item.AddedBy) %>
        </td>
        <td>
            <%= Html.Encode(String.Format("{0:g}", item.addedDate)) %>
        </td>
        <td>
            <%= Html.Encode(item.LocationId) %>
        </td>
        <td>
            <%= Html.Encode(String.Format("{0:g}", item.purchasedDate)) %>
        </td>
        <td>
            <%= Html.Encode(item.purchasedby) %>
        </td>
        <td>
            <%= Html.Encode(String.Format("{0:g}", item.disposalDate)) %>
        </td>
        <td>
            <%= Html.Encode(item.assetModelId) %>
        </td>
        <td>
            <%= Html.Encode(item.employeeId) %>
        </td>
        <td>
            <%= Html.Encode(item.depreciated) %>
        </td>
    </tr>

<% } %>

</table>

<p>
    <%= Html.ActionLink("Create New", "Create") %>
</p>

</asp:Content>

【讨论】:

  • 我必须为索引、创建和编辑页面执行此操作。因为如果保留为接口,它不会自动生成任何属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 2011-05-06
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多