簡體   English   中英

ASP.NET Core 2.0閱讀:剃須刀頁面中的選項

[英]ASP.NET Core 2.0 read: Options in razor page

按照指南,我試圖在ASP.NET Core 2.0頁面上顯示設置值。

在startup.cs中,我添加了一些服務:

services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddOptions();
services.Configure<MyOptions>(Configuration);

在這里定義MyOptions的地方:

namespace WebApplication1
{
    public class OptionsController : Controller
    {
        private readonly SubOptions _SubOptions;

        public OptionsController(IOptions<SubOptions> options)
        {
            _SubOptions = (SubOptions) options;
        }

        public IActionResult Index()
        {
            var RefreshTime = _SubOptions.RefreshTime;
            return Content($"RefreshTime = {RefreshTime}");
        }
    }

    public class MyOptions
    {
        public MyOptions()
        {
            SubOpt = new SubOptions();
        }

        public SubOptions SubOpt { get; set; }
    }

    public class SubOptions
    {
        public SubOptions()
        {
            RefreshTime = 5;
        }

        public int RefreshTime { get; set; }
    }
}

從startup.cs嘗試,我可以訪問RefreshTime設置。 現在,我想直接在cshtml中執行此操作:

@using Microsoft.Extensions.Options
@model MyOptions
@inject IOptions<MyOptions> Options
@page
@model AboutModel
@{
    ViewData["Title"] = "About";
}
<
<h3>@Model.Message</h3>
<br />
<div>
    <h3>Options</h3>
    <h4>Sub Options</h4>
    <p><b>Refresh time</b> @Options.Value.SubOptions.RefreshTime</p>
</div>

該頁面無法加載,但在VisualStudio的輸出控制台或瀏覽器之一中都看不到任何錯誤。

此外,即使我只是將第一個@using指令放在此處,也刪除了所有其他選項,該頁面也不會加載。

然后我檢查我是否已安裝該軟件包,看起來是這樣的:

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" />
    <PackageReference Include="Microsoft.Extensions.Options" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.0" PrivateAssets="All" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
  </ItemGroup>

我還需要做其他事情嗎?

更新

正如@Niladri指出的,我混合了MVC和Razor頁面(我將在此主題上打開一個單獨的問題)。

現在,我刪除了控制器類,因為剃須刀頁面不需要。 無論如何,主要的問題是,如果我在任何頁面上添加@using Microsoft.Extensions.Options ,這將不允許頁面加載。

但是我看不到任何錯誤或異常。

您仍然需要在startup.cs文件中添加以下代碼

services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddOptions();
services.Configure<MyOptions>(Configuration); 

您還需要在appsettings.json中設置RefreshTime的默認值,然后在.cshtml頁面中使用以下代碼

@using Microsoft.Extensions.Options;
@using <enter the namespace for your MyOptions class here>;
@inject IOptions<MyOptions> Options
@page
@model AboutModel
@{
    ViewData["Title"] = "About";
}
<
<h3>@Model.Message</h3>
<br />
<div>
    <h3>Options</h3>
    <h4>Sub Options</h4>
    <p><b>Refresh time</b> @Options.Value.SubOpt.RefreshTime</p>
</div>

請讓我知道這對你有沒有用。

答案在這里

@page Razor指令使文件成為MVC操作-這意味着它可以處理請求。 @page必須是頁面上的第一個Razor指令。

因此,解決方案非常簡單,只需對指令重新排序即可:

@page
@using Microsoft.Extensions.Options
@inject IOptions<MyOptions> Options
@model AboutModel
@{
    ViewData["Title"] = "About";
}
<
<h3>@Model.Message</h3>
<br />
<div>
    <h3>Options</h3>
    <p><b>Refresh time</b> @Options.Value.SubOpt.RefreshTime</p>
</div>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM