2015-08-31 16 views
5

Ich erstelle eine statische Klasse mit statischen Methoden, um den Controllern zu helfen, ihre Arbeit zu erledigen. Wenn beim Aufbau der Anwendung ich die folgende Fehlermeldung erhalten:Verwendung von Controller.Content außerhalb des MVC Controllers C#

Error 40 ' System.Web.Mvc.Controller.Content(string) ' is inaccessible due to its protection level"

Jede Idee, wie dieses Problem zu lösen?

Hinweise: Es ist ein C# mvc aplication

public static ActionResult GetAlbumJSON(AlbumVO album) 
{ 
    return Controller.Content(
     JsonConvert.SerializeObject(new 
     { 
      max_car = @ABookClient.maxCharsProjecName, 
      trans_img = @ABookClient.Transparent_Image, 
      show_description = @ABookClient.Show_Product_Description, 
      product_type = "Album", 
      obj = CreateObjAlbumVO(album), 
     }) 
    ); 
} 
+1

Machen Sie Ihre Methode Content öffentlich –

+3

Sie besser Ihre eigenen Basis-Controller erstellen, die von 'System.Web.Mvc.Controller' leitet und Ihre Helfer setzen dort, damit Sie keine Probleme mit der Unzugänglichkeit haben. – haim770

+0

Warum nicht einfach 'Json (neu {max_car ...}) zurückgeben' '? – haim770

Antwort

4

Inhalt Methode wird intern geschützt, so dass Sie es nicht außerhalb des Controllers nutzen können. Controller.Content Method. Höchstwahrscheinlich verletzt Ihre statische Klasse das SRP-Prinzip. Lassen Sie ihn seine Arbeit machen (Initialisierung, Serialisierung, ...) und Controller - Controller Job - Ergebnis an den Client zurückgeben.

protected internal ContentResult Content(string content) 

Es würde aussehen smth wie:

public static class MyHelper 
{ 
    public static object GetAlbum(AlbumVO album) 
    { 
     return new 
      { 
       max_car = @ABookClient.maxCharsProjecName, 
       trans_img = @ABookClient.Transparent_Image, 
       show_description = @ABookClient.Show_Product_Description, 
       product_type = "Album", 
       obj = CreateObjAlbumVO(album), 
      }; 
    } 
} 

public class AlbumController : Controller 
{ 
    public ActionResult GetAlbums(int id) 
    { 
     var album = Context.GetAlbum(id); 
     var convertedResult = MyHelper.GetAlbum(album); 
     return Json(convertedResult); 
    } 
} 

Auch würde ich bei AutoMapper einen Blick nehmen beraten Antwort für die Erstellung von Client-Objekten

+0

Sie haben Recht mit dem Schutz der internen Sache. Aber der Code, den du gepostet hast, ist falsch. Es entspricht meinem Problem, so dass es nichts lösen wird: S Siehe die Kommentare unter der Frage –

+0

@RicardoRocha mein schlechtes. Fest. Jetzt verwendet der Helfer die Inhaltsmethode nicht – Artiom

1

Ich denke, dies gilt Fall für eine view- ist Modell für ein JSON-Ergebnis, da Sie eine Trennung zwischen dem Domänenmodell und den an den Client zurückgesendeten Daten wünschen. Die Verwendung eines Ansichtsmodells bietet Ihnen auch eine geeignete Stelle, um diese Zuordnung zwischen dem Domänenmodell und der Ansicht (dem JSON) festzulegen, sodass Sie nicht an eine Hilfsklasse delegieren müssen.

public class AlbumModel 
{ 
    [JsonProperty(PropertyName = "max_car")] 
    public int MaxChars { get; private set; } 
    [JsonProperty(PropertyName = "trans_img")] 
    public string TransparentImage { get; private set; } 
    [JsonProperty(PropertyName = "product_type")] 
    public string ProductType { get; private set; } 
    [JsonProperty(PropertyName = "obj")] 
    public AlbumInfo Object { get; private set; } 
    [JsonProperty(PropertyName = "show_description")] 
    public bool ShowProductDescription { get; private set; } 

    public AlbumModel(AlbumVO album) 
    { 
     MaxChars = album.maxCharsProjecName; 
     TransparentImage = album.Transparent_Image; 
     ShowProductDescription = album.Show_Product_Description; 
     ProductType = "Album"; 
     Object = new AlbumInfo(album); 
    } 
} 

Die AlbumInfo Klasse stellt zusätzliche Zuordnungen für Ihre JSON Ergebnis, das die „obj“ Eigentum zurück an den Client gesendet wird.

public class AlbumInfo 
{ 
    // ... define properties here 
    public AlbumInfo(AlbumVO album) 
    { 
     // ... map properties here 
    } 
} 

Und Ihre Controller wird schön und sauber:

public class AlbumController : Conrtoller 
{ 
    public ActionResult GetAlbums(int id) 
    { 
     var album = Context.GetAlbum(id); 
     var model = new AlbumModel(album); 
     return Json(model); 
    } 
} 
Verwandte Themen