2015-08-31 9 views
5

Sto creando una classe statica con metodi statici per aiutare i controllori a svolgere il proprio lavoro. Quando si genera l'applicazione, viene visualizzato il seguente errore:Uso di Controller.Content Controller esterno MVC C#

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

Qualche idea su come risolvere questo problema?

Note: E 'un 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

Fai il tuo metodo di contenuti pubblici –

+3

È meglio creare il proprio controller di base che deriva da 'System.Web.Mvc.Controller' e mettete i vostri aiutanti lì in modo da non avere problemi di inaccessibilità. – haim770

+0

Perché non semplicemente 'return Json (new {max_car ...})'? – haim770

risposta

4

metodo del contenuto è protetto interna, quindi non è possibile utilizzarlo al di fuori del controllo. Controller.Content Method. Molto probabilmente la tua classe statica viola il principio SRP. Lascia che faccia il suo lavoro (inizializzazione, serializzazione, ...) e controller - lavoro del controllore - restituisca il risultato al cliente.

protected internal ContentResult Content(string content) 

Sembrerebbe dovrebbe occupare come:

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); 
    } 
} 

Inoltre mi piacerebbe consiglio di dare un'occhiata al AutoMapper per la creazione di risposta del client oggetti

+0

Hai ragione riguardo alla cosa interna di protezione. Ma il codice che hai postato è sbagliato. È uguale al mio problema quindi non risolverà nulla: S Vedi i commenti sotto la domanda –

+0

@RicardoRocha my bad. Fisso. Ora l'helper non usa il metodo Content – Artiom

1

Credo che questo sia caso valida per un vista- modello per un risultato JSON poiché si desidera una separazione tra il modello di dominio e i dati inviati al client. L'utilizzo di un modello di visualizzazione offre anche una posizione corretta in cui inserire questo mapping tra il modello di dominio e la vista (il JSON) in modo che non sia necessario delegare a una classe helper.

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); 
    } 
} 

La classe AlbumInfo fornisce mappature aggiuntive per il vostro risultato JSON, che diventa la proprietà "obj" inviato al client.

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

E il controller diventa bello e pulito:

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