Aspnetcore: Comment puis-je injecter des options dans la vue ?

Créé le 11 sept. 2015  ·  3Commentaires  ·  Source: dotnet/aspnetcore

J'ai un point de terminaison Azure CDN provenant de Configuration que j'essaie de conserver dans Options et d'injecter dans les vues où il sera utilisé. Je suis bloqué ... la documentation .NET n'affiche pas le code de balisage pour l'injection d'options d'affichage et le message de Rick ne semble pas être mis à jour pour beta7. Je suis sur dnx-coreclr-win-x64.1.0.0-beta7, et c'est une application dnxcore50.

Modèle

(Confus sur les meilleures pratiques ici : est-ce que cela va même dans les modèles ?)

``` c#
espace de noms MyApp.Models
{
classe publique AppOptions
{
chaîne publique CDN { obtenir ; ensemble; }
}
}

#### Startup

``` c#
public class Startup
{
    public IConfiguration Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var configurationBuilder = new ConfigurationBuilder().AddEnvironmentVariables();
        Configuration = configurationBuilder.Build();
        Configuration["CDN"] = "az123456";
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddOptions();
        services.Configure<AppOptions>(Configuration);
        services.AddSingleton(_ => Configuration);
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseErrorPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseErrorHandler("/error");
        }
        app.UseStaticFiles();
        app.UseMvcWithDefaultRoute();
    }
}

HomeController

``` c#
classe publique HomeController : Contrôleur
{
public HomeController(IOptionsoptionsAccesseur)
{
Options = optionsAccessor.Options ;
}

AppOptions Options { get; }

[Route("/error")]
public IActionResult Script() => File("/wwwroot/error.htm", "text/html");

[HttpGet]
public IActionResult Index()
{
    return View("index", Options);
}

}

#### Markup

If everything else above is ok, the markup part is unclear to me. How do I inject this?
- as a model with `<strong i="32">@model</strong> MyApp.Models.AppOptions`
- with inject `<strong i="33">@inject</strong> MyApp.Models.AppOptions AppOptions`
- is the problem with the reference in the `src=` ... how do I break the property lookup at the "CDN" before the period prior to "vo"?

``` html
<strong i="34">@inject</strong> MyApp.Models.AppOptions AppOptions
...
<body>
    <!-- Error (squiggles) on "AppOptions"  and complains it can't be found -->
    <img src="http://@{AppOptions.CDN}.vo.msecnd.net/container/image.png" alt="Image from CDN">
    <!-- Error (squiggles) on "vo" and complains its trying to lookup "vo" on the property -->
    <img src="http://@AppOptions.CDN.vo.msecnd.net/container/image.png" alt="Image from CDN">
</body>
...

... même résultat si j'utilise <strong i="37">@model</strong> MyApp.Models.AppOptions et @{Model.CDN}.vo... ou @Model.CDN.vo... .

Commentaire le plus utile

Pour tous les autres, rappelez-vous que vous devez entièrement qualifier l'interface à injecter.

<strong i="6">@inject</strong> Microsoft.Extensions.Options.IOptions<AppOptions> AppOptionsAccessor

Tous les 3 commentaires

Étant donné que IOptions est celui qui se trouve dans le conteneur DI, vous devez <strong i="6">@inject</strong> IOptions<AppOptions> AppOptionsAccessor

Pour les gribouillis Razor, le problème est que vous utilisez les mauvaises parenthèses :

<img src="http://@(AppOptionsAccessor.Options.CDN).vo.msecnd.net/container/image.png" alt="Image from CDN">

@pranavkm Ah ! Je t'ai eu. Merci.

Pour tous les autres, rappelez-vous que vous devez entièrement qualifier l'interface à injecter.

<strong i="6">@inject</strong> Microsoft.Extensions.Options.IOptions<AppOptions> AppOptionsAccessor

Cette page vous a été utile?
0 / 5 - 0 notes