Дублирование кода в контроллерах MVC - PullRequest
4 голосов
/ 26 августа 2009

Мне кажется, у меня проблема с пониманием правильного способа использования MVC. У меня проблема в том, что у меня есть пользователи и пользователи-администраторы, и им разрешено создавать кампании, но они используют разные главные страницы и т. Д. И т. Д.

Мое решение до сих пор ...

Controllers
    AdminUserController.cs
    UserController.cs

Views
    AdminUser
        CreateCampaign.aspx
    User
        CreateCampaign.aspx

Но, делая это таким образом, мне приходится дублировать код CreateCampaign () как в AdminUserController, так и в UserController, и у меня есть два представления, чтобы сделать то же самое.

Это правильный способ сделать это, или я куда-то скучаю по лодке?

Ответы [ 6 ]

9 голосов
/ 26 августа 2009

Извлечение общего кода в базовый контроллер, от которого оба наследуют. Извлеките общее представление в общее, общее частичное представление (ViewUserControl), затем включите в каждое представление это общее частичное представление Последнее действительно необходимо, так как в вашем представлении используются разные главные страницы.

Контроллеры:

BaseUserController
    CreateCampaign()

UserController : BaseUserController
AdminController : BaseUserController

Просмотров:

Shared
   CreateCampaignShared.ascx
   Admin.Master
   User.Master
Admin
   CreateCampaign.aspx  -- includes <% Html.RenderPartial( "CreateCampaignShared" ); %>
User
   CreateCampaign.aspx  -- includes <% Html.RenderPartial( "CreateCampaignShared" ); %>
2 голосов
/ 26 августа 2009

Вы можете очень хорошо работать с одним контроллером, оставьте это UserController. Админ просто еще один пользователь, верно? В вашем коде CreateCampaign () вы можете проверить «особый» статус вошедшего в систему пользователя и установить некоторые дополнительные свойства перед сохранением данных.

Возможность использования общего вида зависит от того, насколько они различаются. Вы можете использовать простые проверки IsAdmin () в представлении, чтобы отображать или нет некоторые дополнительные элементы управления. Или вы можете проверить это в контроллере и обслуживать тот или иной вид.

1 голос
/ 26 августа 2009

Почему у вас два разных "пользователя"? Я бы предпочел один пользовательский класс и роли для предоставления доступа к различным представлениям / действиям

Затем вы должны создать Campain-Controller и создать CreateCampaign-Action.

0 голосов
/ 26 августа 2009

Если это так же просто, как отображение другого мастера для пользователей, которые являются администраторами, вы можете настроить главную страницу для использования для просмотра с контроллера следующим образом: -

return View("CreateCampaign", User.IsInRole("Admin") ? "Admin", "User");

Это должно позволить вам иметь один контроллер Campaign и представление Create, которое кажется мне более естественным, чем контроллеры, предназначенные для определенного типа пользователя (что походит на детали реализации).

0 голосов
/ 26 августа 2009

Как насчет наличия CampaignController, у которого есть метод Create, который затем отображает различные представления в зависимости от типа пользователя. Что-то вроде:

public class CampaignController : Controller {

  public ActionResult Create() {
    //...
    if (User.IsInRole("Admin") {
      Return View("AdminUser/CreateCampaign");
    }
    else {
      Return View("User/CreateCampaign");
    }
  }

}

И, как говорили другие, дублированная разметка / код в представлениях должна быть разделена на частичные представления, а затем используется RenderPartial ():

<% Html.RenderPartial("Campaign") %>
0 голосов
/ 26 августа 2009

Вам не хватает частичной лодки:)

Вы можете создать один файл CreateCampaign.ascx, который использует общий код представления, и вызывать его как частичное представление в другом представлении. Вместо создания полных представлений создайте частичное представление (файл .ascx), и в нем будет содержаться повторяющийся код и разметка.

Затем вы можете использовать его в других представлениях следующим образом:

<% Html.RenderPartial("CreateCampaign") %>

Повторно используйте код вашего контроллера, выделив его в некоторый базовый контроллер, от которого наследуются ваши конкретные контроллеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...