2017-01-08 1 views
1

Wir folgen diesem offiziellen ASP.NET-Dokument: Managing Application State. In unserem one wir Controller setzen wir einen Wert für HttpContext.Items[...] und versuchen, auf diesen Wert von einem ViewComponent zuzugreifen, der von der entsprechenden Ansicht aufgerufen wird. Aber wir bekommen HttpContext.Items[...] als Null innerhalb ViewComponent.Zugriff auf HttpContext.Items von ViewComponent gibt NULL zurück

Controller:

HttpContext.Items["TestVal"]= "some value"; 

Ausblick:

@await Component.InvokeAsync("myVC") 

ViewComponent:

public class myVCViewComponent : ViewComponent 
{ 
    public async Task<IViewComponentResult> InvokeAsync() 
    { 
     String myVal= Http.Items["TestVal"].ToString(); //issue: Http.Items["TestVal"] is null at this line 
     return View(items); 
    } 
} 

UPDATE:

In Controller-Abschnitt oben geändert Http.Items-HttpContext.Items in der Linie an: HttpContext.Items["TestVal"]= "some value";

Antwort

1

Schluss Update:

Ich habe getestet einfachen Fall wie wie in Ihrem Beispiel, und dies funktioniert gut (auf MVC Core v1.1.0).

Also, es ist schwer zu sagen, warum es in Ihrem speziellen Fall nicht funktioniert.

nach unserer Diskussion jedoch in den Kommentaren, haben Sie eine Quelle des Problems gefunden:

Ich erkennen das Problem nicht auf ViewComponent bezogen; es ist vielmehr Umfang der Httpcontext


Orginal Antwort bezogen werden:

In der Dokumentation, die Sie lesen können:

Sein Inhalt nach jeder Anfrage wird verworfen. Es ist am besten als ein Mittel der Kommunikation zwischen den Komponenten oder Middleware verwendet, die

und in Abschnitt Working with HttpContext.Items während einer Anfrage an verschiedenen Punkten in der Zeit arbeiten:

Diese Sammlung von Anfang an einem zur Verfügung steht Httprequest und wird am Ende jeder Anfrage verworfen.

und in View Components documentation:

eher über die Unterzeichnung überlastet sind als alle Details der aktuellen HTTP-Anforderung

+0

Ich habe meine ursprüngliche Antwort gelöscht, da ich falsch lag - Bitte finden Sie mein Update. –

+0

Für Ihre Anfrage habe ich es nicht markiert. Und, ja, im Code habe ich 'HttpContext.Items' anstelle von' Http.Items'. Ich habe auch meinen Beitrag aktualisiert. – nam

+1

Das Problem hängt mit dem zusammen, auf das Sie in Ihrer ursprünglichen Antwort hingewiesen haben: "Der Inhalt wird nach jeder Anfrage verworfen." Was ich tat war, dass ich ein linkes Navigationsmenü habe, das über eine andere ViewComponent über einen anderen Controller aufgefüllt wird. Wenn ein Benutzer auf einen Link im linken Menü klickt, ruft er eine andere Aktion in einem anderen Controller auf, der Informationen an seine View sendet, die wiederum eine andere ViewComponent aufrufen. Nachdem Sie mich auf die Zitate aus den referenzierten Dokumenten verwiesen haben, wurde mir klar, dass das Problem nicht mit ViewComponent zusammenhängt. es ist eher mit dem Umfang von HttpContext verbunden – nam

0

Erste HttpContext.Current ist in ASP.NET-Core nicht möglich.Der Zugriff auf den aktuellen HTTP-Kontext von einer separaten Klassenbibliothek ist die Art von unordentlicher Architektur, die ASP.NET Core zu vermeiden versucht.

Aber es ist möglich, den Zusammenhang mit IHttpContextAccessor von dem ASP.NET-Core Dependency Injection-System wie das zu bekommen:

public class SomeClass 
{ 
    private readonly IHttpContextAccessor _httpContextAccessor; 

    public SomeClass(IHttpContextAccessor httpContextAccessor) 
    { 
     _httpContextAccessor = httpContextAccessor; 
    } 
} 

Wenn die HttpContextAccessor dann injiziert wird man so etwas tun können: var context = _httpContextAccessor.HttpContext;.