【发布时间】:2020-01-01 13:59:37
【问题描述】:
我正在尝试了解 Razor 页面的细微差别。我使用添加 Razor 页面上的 EF CRUD 选项从模型中的 Equity 实体构建了一组新页面。这创建了通常的索引、编辑、创建、详细信息和删除页面。
索引视图工作,并检索示例数据。
该实体没有单一的 Id 属性,它有一个使用 Symbol 和 TradeDate 属性的复合主键。我调整了我的编辑代码以使页面如下所示。
public async Task<IActionResult> OnGetAsync(string symbol, string date)
{
if (string.IsNullOrEmpty(symbol) || string.IsNullOrEmpty(date))
{
return NotFound();
}
Equity = await _context.Equities
.FirstOrDefaultAsync(m => m.Symbol == symbol
&& m.TradeDate == Convert.ToDateTime(date));
if (Equity == null)
{
return NotFound();
}
return Page();
}
股权实体
public class Equity : SecurityBase
{
public string Symbol { get; set; }
public DateTime TradeDate { get; set; }
public decimal Open { get; set; }
public decimal High { get; set; }
public decimal Low { get; set; }
public decimal Close { get; set; }
public double Volume { get; set; }
}
在 Fluent Configuration 中定义为
public void Configure(EntityTypeBuilder<Equity> builder)
{
builder.HasKey(k => new {k.Symbol, k.TradeDate})
.HasName("PK_Equity");
builder.Property(u => u.Symbol)
.IsRequired()
.HasMaxLength(32);
builder.Property(u => u.TradeDate)
.HasColumnType("Date")
.IsRequired();
//rest removed for brevity
}
当我点击第一个数据行的编辑链接时,它会创建这个 url
https://localhost:44391/EquityTradeData?Symbol=LYFT&TradeDate=8%2F19%2F2019&action=Edit
网址确实应该看起来像 EquityTradeData/Edit?Symbol=...。
注意:我手动将 url 更改为如上所示,现在它正在使用 OnGet 方法,但查询字符串中的日期值始终为空。所以有两个问题,date值为null和生成的url错误,需要EquityTradeData后面的/Edit
从此标记(如果可能,我想将其更改为标签助手)
@Html.ActionLink("Edit", "Edit", new { Symbol = item.Symbol,TradeDate = item.TradeDate.ToShortDateString()})
但是点击那个“编辑”链接并没有做任何事情,地址栏中的 url 发生了变化,但页面没有重新路由到编辑页面,并显示该选定日期的编辑表单。
它停留在显示示例数据的索引页面上。
一切对我来说都是正确的,但我不确定生成的 url 在 Razor 中是如何工作的,所以我假设它生成重新路由 url 的方式有问题。
我尝试过调试,但是当我从索引页面单击编辑链接时,永远不会调用 Edit.cshtml.cs 中的 OnGetAsync 方法。
【问题讨论】:
-
想知道这个
OnGetAsync(string symbol, string date)是否应该是这个OnGetAsync(string symbol, DateTime tradeDate) -
你试过
@Html.ActionLink("Edit", "Edit", "Edit", new { Symbol = item.Symbol, TradeDate = item.TradeDate.ToShortDateString()})(controllerName也有过载)?你也可以试试OnGetAsync([FromQuery] string symbol, [FromQuery] string date) -
我已经尝试了以上所有三个建议并且得到了相同的结果;什么都没发生。页面不会重新路由
标签: c# asp.net-core entity-framework-core razor-pages