2013-06-12 66 views
3

我有两个项目,d2admin和PartyWeb。从MVC4中查看另一个项目的呼叫控制器

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

PartyWeb为派对中的每个表格提供控制器。

假设我有一张名为 - Organization的表。 此表的控制器将位于PartyWe/Controllers文件夹中。

我会在d2admin中查看。

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

我试着用Html.RenderAction,这是工作的控制器存在于相同的,当我调用差异项目的控制器我越来越 - 缺少方法异常。

有人可以帮忙吗?

+0

要在另一个使用一个项目的代码,看看[这里](http://stackoverflow.com/questions/1116465/how-do-you-share- code-between-projects-solutions-in-visual-studio)可能的dublicate。 – Drasive

回答

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连接到车载控制器(控制器上的文件夹,右击并选择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)的意见,下面的代码工作得很好,即使汽车称为控制器在第二到存在项目。该链接用于第一个项目中的主页(控制器)/索引(视图)。

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

你可以在这里分享你的观点吗?我的模型在我的PartyBiz项目中,我们使用知识库来获得那些不是问题的模型。我想知道我们如何调用第二个项目中存在的控制器。感谢很多尝试.. – mmssaann

+0

它是如何与命名空间?您是否可以在PartyBiz项目中更改模型和控制器的命名空间,使它们与d2admin项目相同? – Ohlin

+0

我已经验证第二个项目(PartyBiz)不需要与第一个项目(d2admin)相同的名称空间。所以你可以忘记我关于命名空间的讨论。所以模型和控制器(在第二个项目中)我给名称空间PartyBiz和视图(在第一个项目中),我更新了它们以便引用新的PartyBiz名称空间......我将更新上面的示例代码以及几秒... – Ohlin

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 /模型发现/ 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. 
    } 
}