从MVC4中的视图调用另一个项目的控制器

时间:2013-06-12 05:59:08

标签: asp.net-mvc-4 razor-2

我有两个项目,d2admin和PartyWeb。

d2admin是实际的用户界面,它将包含所有必需的css,js和视图eftc。以及控制器(如果需要)。

PartyWeb正在为Party中的每个表提供控制器。

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

我将在d2admin中获得意见。

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

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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; }
    }
}

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

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

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控制器引用。此链接用于第一个项目中的主页(控制器)/索引(视图)。

@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>

答案 1 :(得分:0)

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

根据我的理解,以下事情都是真的:

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

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

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

<h3>A Very Basic View</h3>

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

请注意,此视图包含无模型,并调用部分模型,并在其中填充了该模型......这就是它!现在我们如何编写_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.
    }
}