2013-06-12 6 views
3

У меня есть два проекта, d2admin и PartyWeb.Контроллер вызова другого проекта из представления в MVC4

d2admin - это фактический пользовательский интерфейс, он будет иметь все необходимые css, js и views eftc., А также контроллеры, если потребуется.

У PartyWeb есть контроллеры для каждой таблицы в Party.

Скажем, у меня есть таблица под названием - Организация. Контроллер этой таблицы находится в папке PartyWe/Controllers.

У меня будет вид в d2admin.

Теперь моя проблема в том, как я могу вызвать OrganizationController в PartyWeb из представления Organization.cshtml в d2admin?

Я пробовал с Html.RenderAction, это работает для контроллеров, существует в том же самом, когда я вызываю контроллер проекта diff. Я получаю исключение метода исключения.

Может ли кто-нибудь помочь?

+0

Чтобы использовать код из одного проекта в другой, посмотрите на [это] (http://stackoverflow.com/questions/1116465/how-do-you-share- code-between-projects-solutions-in-visual-studio) можно дублировать. – 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 подключений к машине (щелкнув правой кнопкой мыши на папке 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) путем перетаскивания. Затем я удалил представления из второго проекта, чтобы убедиться, что они там не используются.

Мне также пришлось добавить ссылку из первого проекта (с видами) во второй проект (модель и контроллер). После этого он работал отлично, чтобы запустить первый проект.

Я продолжал включать миграции в проект-контроллер-модель и без проблем получал соединение с базой данных. Я мог видеть, что контроллеру удалось сохранить данные, даже если он был расположен в другом проекте.

Я надеюсь, что это может помочь вам на пути ...

EDIT: Используя следующий код в представлениях от первого проекта (d2admin) работал отлично, даже если контроллер автомобиля упоминается существует во втором проект. Эта ссылка использовалась в домашнем (контроллере)/индексе (представлении) в первом проекте.

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

EDIT2: Это мнение индекс для контроллера автомобиля. Вид находится в 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, где 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. 
    } 
} 
Смежные вопросы