在MVC控制器中复制代码

时间:2009-08-26 15:02:15

标签: asp.net-mvc

我认为我在理解使用MVC的正确方法时遇到了问题。我遇到的问题是我有用户和管理员用户,都可以创建一个广告系列,但他们使用不同的母版页等等。

到目前为止我的解决方案是......

Controllers
    AdminUserController.cs
    UserController.cs

Views
    AdminUser
        CreateCampaign.aspx
    User
        CreateCampaign.aspx

但是以这种方式这样做我必须在AdminUserController和UserController中复制CreateCampaign()代码,我有2个视图来做同样的事情。

这是正确的做法还是我错过了某个地方的船?

6 个答案:

答案 0 :(得分:9)

将公共代码解压缩到两个都继承的基本控制器。将共享视图提取到公共的共享局部视图(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" ); %>

答案 1 :(得分:2)

你可以用一个控制器做得很好,把它留给UserController。管理员只是另一个用户,对吗?在CreateCampaign()代码中,您可以检查登录用户的“特殊”状态,并在保存数据之前设置一些额外的属性。

您是否可以使用共享视图取决于它们的变化程度。您可以在视图中使用简单的IsAdmin()检查来呈现或不呈现一些额外的控件。或者您可以在控制器中查看它并提供一个或另一个视图。

答案 2 :(得分:1)

为什么你有两个不同的“用户”?我更喜欢一个用户类和角色来提供对不同视图/操作的访问

然后你会创建一个Campain-Controller和一个CreateCampaign-Action。

答案 3 :(得分:0)

你错过了部分船:)

您可以创建一个CreateCampaign.ascx文件,该文件共享公共视图代码,并在其他视图中将其称为部分视图。创建局部视图(.ascx文件),并使其包含重复的代码和标记,而不是创建完整视图。

然后你可以在其他视图中重复使用它:

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

通过将控制器代码分解到特定控制器继承的某个基本控制器来重新使用它。

答案 4 :(得分:0)

如果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") %>

答案 5 :(得分:0)

如果它像向管理员用户显示不同的主数据一样简单,您可以设置主控页面用于控制器中的视图,如下所示: -

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

这应该允许你拥有一个Campaign控制器和Create视图,这对我来说比专用于特定类型用户的控制器更自然(听起来像一个实现细节)。