4 Stimmen

Duplizierung von Code in MVC-Controllern

Ich glaube, ich habe ein Problem im Verständnis der richtigen Art der Verwendung von MVC. Das Problem, das ich habe, ist, dass ich Benutzer und Admin-Benutzer habe, beide dürfen eine Kampagne erstellen, aber sie verwenden verschiedene Masterseiten etc. etc.

Meine bisherige Lösung ist...

Controllers
    AdminUserController.cs
    UserController.cs

Views
    AdminUser
        CreateCampaign.aspx
    User
        CreateCampaign.aspx

Aber dabei auf diese Weise muss ich den Code CreateCampaign() sowohl im AdminUserController als auch im UserController duplizieren, und ich habe 2 Ansichten, um die gleiche Sache zu tun.

Ist das die richtige Vorgehensweise, oder habe ich etwas übersehen?

9voto

tvanfosson Punkte 506878

Extrahieren Sie den gemeinsamen Code in einen Basis-Controller, von dem beide erben. Extrahieren Sie die gemeinsame Ansicht in eine gemeinsame, geteilte Teilansicht (ViewUserControl) und lassen Sie dann jede Ansicht diese geteilte Teilansicht enthalten. Letzteres ist eigentlich nur notwendig, da Ihre Ansicht verschiedene Masterseiten verwendet.

Kontrolleure:

BaseUserController
    CreateCampaign()

UserController : BaseUserController
AdminController : BaseUserController

Ansichten:

Shared
   CreateCampaignShared.ascx
   Admin.Master
   User.Master
Admin
   CreateCampaign.aspx  -- includes <% Html.RenderPartial( "CreateCampaignShared" ); %>
User
   CreateCampaign.aspx  -- includes <% Html.RenderPartial( "CreateCampaignShared" ); %>

2voto

Sie können ziemlich gut mit einem einzigen Controller tun, lassen Sie es UserController. Admin ist nur ein weiterer Benutzer, richtig? In Ihrem CreateCampaign()-Code können Sie auf den "besonderen" Status des angemeldeten Benutzers prüfen und einige zusätzliche Eigenschaften festlegen, bevor Sie die Daten speichern.

Ob man mit einer geteilten Ansicht auskommt, hängt davon ab, wie sehr sie sich unterscheiden. Sie können einfache IsAdmin()-Prüfungen in der Ansicht verwenden, um einige zusätzliche Steuerelemente anzuzeigen oder nicht. Oder Sie können es im Controller überprüfen und die eine oder andere Ansicht bedienen.

1voto

griti Punkte 650

Warum haben Sie zwei verschiedene "Benutzer"? Ich würde eine Benutzerklasse und Rollen bevorzugen, um Zugang zu verschiedenen Ansichten/Aktionen zu erhalten

Dann würden Sie einen Campain-Controller und dort eine CreateCampaign-Action erstellen.

0voto

womp Punkte 113535

Sie verpassen den Teil des Bootes :)

Sie können eine Datei CreateCampaign.ascx erstellen, die den gemeinsamen Ansichtscode enthält, und diese als Teilansicht in einer anderen Ansicht aufrufen. Anstatt vollständige Ansichten zu erstellen, erstellen Sie eine Teilansicht (eine .ascx-Datei), die den doppelten Code und das Markup enthält.

Damit können Sie sie in anderen Ansichten wiederverwenden:

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

Verwenden Sie Ihren Controller-Code wieder, indem Sie ihn in einen Basis-Controller überführen, von dem Ihre spezifischen Controller erben.

0voto

David Glenn Punkte 23872

Wie wäre es mit einem CampaignController, der über die Methode Create verfügt, die dann je nach Benutzertyp unterschiedliche Ansichten anzeigt. Etwas wie:

public class CampaignController : Controller {

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

}

Und wie andere gesagt haben die duplizierten Markup / Code in den Ansichten sollte in partielle Ansichten getrennt werden und dann RenderPartial() verwendet:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X