3

我有两个项目,d2admin 和 PartyWeb。

d2admin 是实际的 UI,它将包含所有必要的 css、js 和视图等,如果需要,还包含控制器。

PartyWeb 对 Party 中的每个表都有控制器。

假设我有一个名为 - 组织的表。该表的控制器将位于 PartyWe/Controllers 文件夹中。

我将在 d2admin 中查看视图。

现在我的问题是如何从 d2admin 中存在的视图 Organization.cshtml 调用 PartyWeb 中存在的 OrganizationController?

我尝试使用 Html.RenderAction,这适用于相同的控制器,当我调用 diff 项目的控制器时,我得到了 - 缺少方法异常。

4

2 回答 2

2

我发现您的问题很有趣,并决定自己测试一下。我创建了两个 MVC 项目(但其中一个也可以是类库,不过我很懒)。第一个 MVC 项目成为具有路由和视图的主要项目,第二个项目获得了模型和控制器。它从一开始就很有魅力,这就是我的做法。

我在第二个项目中创建了模型,在我的示例中命名为 Car(名称 UsersContext 保留在默认文件中,因为我想尽可能少地进行更改)。

namespace PartyBiz.Models
{
    public class UsersContext : DbContext
    {
        public UsersContext()
            : base("DefaultConnection")
        {
        }

        public DbSet<Car> Cars { get; set; }
    }

    [Table("Cars")]
    public class Car
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int CarId { get; set; }
        public string CarName { get; set; }
    }
}

然后我构建了项目并创建了一个与 Car 的 EF 连接的控制器(通过右键单击 Controller 文件夹并使用 Entity Framework 选择具有读/写操作和视图的 MVC 控制器

完成后控制器看起来像这样(已删除许多行以保持示例简短)

namespace PartyBiz.Controllers
{
    public class CarController : Controller
    {
        // UsersContext is a left over from the default MVC project
        private UsersContext db = new UsersContext();

        public ActionResult Index()
        {
            return View(db.Cars.ToList());
        }

        // Many other actions follows here...
    }
}

在第二个项目 (PartyBiz) 中创建的视图我通过拖放复制到第一个项目 (d2admin)。然后我从第二个项目中删除了视图,以确保它们没有在那里使用。

我还必须将第一个项目(带有视图)的引用添加到第二个项目(模型和控制器)。之后,运行第一个项目就很好了。

我继续在模型控制器项目中启用迁移,并且没有任何问题地获得了数据库连接。我可以看到控制器设法保存数据,即使它位于不同的项目中。

我希望这可以帮助你在路上......

编辑:在第一个项目(d2admin)的视图中使用以下代码可以正常工作,即使提到的 Car 控制器存在于第二个项目中。此链接在第一个项目中的 home(控制器)/index(视图)中使用。

@Html.ActionLink("Go to the cars", "Index", "Car")

EDIT2:这是 Car 控制器的索引视图。该视图位于 d2admin 中,并且正在引用 PartyBiz 项目中的控制器。

@model IEnumerable<PartyBiz.Models.Car>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.CarName)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.CarName)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.CarId }) |
            @Html.ActionLink("Details", "Details", new { id=item.CarId }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.CarId })
        </td>
    </tr>
}
</table>
于 2013-06-12T07:41:14.633 回答
1

我承认这是一个老问题,答案已经被接受;但是,我遇到了同样的问题并且能够解决它,并想分享我的经验。

据我了解,以下情况属实:

  • d2admin 是处理网站前端的代码,控制器用于驱动视图和/或视图模型。
  • PartyWeb 用作域级别的 API 以与某些数据源进行交互。
  • OrganizationController 是您用于将数据从数据源获取到 d2admin 项目的控制器(反之亦然)

考虑到所有这些,产生局部观点的力量

让我们使用位于 d2admin/Views/SomeController.cshtml 中的非常简单的视图,其中 SomeController 是反映与这些视图关联的控制器的文件夹。

<h3>A Very Basic View</h3>

@Html.Partial("_SomePartialView", OrganizationController.GetOrganizations())

请注意,这个视图没有 model,并且调用了一个 partial ,它的模型就在那里填充......就是这样!现在我们将如何编写_SomePartialView.cshtml?

我们将它放在 d2admin/Views/Shared 文件夹中,因此完整路径为:d2admin/Views/Shared/_SomePartialView.cshtml。该文件看起来像

@model IEnumerable<PartyWeb.Models.Organization>

<div>
   @foreach(var o in Model){
       @Html.DisplayFor(modelItem => item.Id)
       @Html.DisplayFor(modelItem => item.Name)
       <br/>
   }
</div>

正如我们所见,此视图将显示一些基本信息,假设以下是我们在 PartyWeb/Models/Organization.cs 中找到的模型

public class Organization
{
    public int Id {get; set;}
    public string Name {get; set;}
    // some additional properties
}

最后一点魔法... 在 OrganizationController.cs 中,我们需要添加静态操作,使我们能够将数据绑定到局部视图的模型。所以我们要添加以下内容:

public class OrganizationController : ApiController
{
    // Some Other Actions

    [HttpGet]
    public static List<Organization> GetOrganizations()
    {
        var dataSource = GetDataSource(); // Some Method that exposes the datasource
        return ReadAllOrganizations(dataSource); // Some method that allows us to read all of the organiztions from the dataSource, i.e. some sql that executes against a database.
    }
}
于 2016-01-05T17:27:24.483 回答