tob*_*bre 2 c# url-routing razor-pages
在 ASP.NET Core 2.2 Razor Pages 网站中,我尝试从银行帐户列表导航到单个银行帐户的脚手架编辑页面。编辑页面打不开,并显示错误信息:
System.InvalidOperationException:尝试激活“ForexWeb.Pages.BankAccountModel”时无法解析类型“System.Int32”的服务。在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,类型 type,类型 requiredBy,布尔 isDefaultParameterRequired)
银行账户页面 (BankAccounts.cshtml) 是
@page
@model ForexWeb.Pages.BankAccountsModel
@{
ViewData["Title"] = "BankAccounts";
Layout = "~/Pages/Shared/_Layout.cshtml";
}
<h1>Bank Accounts</h1>
<table>
@foreach (var account in Model.BankAccounts)
{
<tr>
<td>@account.AccountNumber</td>
<td>
<a asp-page="Edit" asp-route-id="@account.Id">More</a>
@*<a asp-action="Account/Edit" asp-route-id="@account.Id">Edit</a>*@
</td>
</tr>
}
</table>
Run Code Online (Sandbox Code Playgroud)
编辑页面 (Edit.cshtml) 开头为
@page "{id}"
@model ForexWeb.Pages.BankAccountModel
@{
ViewData["Title"] = "BankAccount";
Layout = "~/Pages/Shared/_Layout.cshtml";
}
<h1>BankAccount</h1>
Run Code Online (Sandbox Code Playgroud)
路由在 Startup.cs 中设置
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc(ConfigureRoutes);
}
private void ConfigureRoutes(IRouteBuilder routeBuilder)
{
routeBuilder.MapRoute("Default", "{controller=Home}/action=Index/{id?}");
}
Run Code Online (Sandbox Code Playgroud)
BankAccountModel 类
public class BankAccountModel : PageModel
{
private readonly int _id;
private readonly IForexRepository _repository;
public BankAccountModel(int id, IForexRepository repository)
{
_id = id;
_repository = repository;
}
[BindProperty]
public ForexRepository.Entities.BankAccount BankAccount { get; set; }
public async Task<IActionResult> OnGetAsync(int? id)
{
if (id == null)
{
return NotFound();
}
BankAccount = _repository.GetBankAccount((int)id);
if (BankAccount == null)
{
return NotFound();
}
ViewData["BankId"] = new SelectList(_repository.GetBanks(), "Id", "Id");
return Page();
}
public IActionResult OnGet()
{
var bankAccount = _repository.GetBankAccount(_id);
BankAccount = bankAccount;
return Page();
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_repository.AddBankAccount(BankAccount.BankId,BankAccount);
try
{
_repository.Save();
}
catch (DbUpdateConcurrencyException)
{
if (!BankAccountExists(BankAccount.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToPage("./Index");
}
private bool BankAccountExists(int id)
{
return _repository.GetBankAccount(id) != null;
}
}
Run Code Online (Sandbox Code Playgroud)
可能是什么问题?
BankAccountModel由 DI 容器创建。创建页面模型时,容器正在解析所有构造函数参数,以便注入它们并创建BankAccountModel. int当容器尝试解析显然未注册的类型的服务时,会引发异常。所以你需要int从构造函数中删除参数
public BankAccountModel(IForexRepository repository)
{
_repository = repository;
}
Run Code Online (Sandbox Code Playgroud)