【问题标题】:Route to Edit page in Razor page from EF Auto Scaffold从 EF Auto Scaffold 路由到 Razor 页面中的编辑页面
【发布时间】: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


【解决方案1】:

如上所述,@Html.ActionLink 没有构建正确的 Url,并且似乎不太适合带有处理程序的 Razor 页面。

我设法使用以下方法使其正常工作

<a asp-page="Edit" asp-page-handler="OnGetAsync" asp-route-symbol="@item.Symbol" asp-route-date="@item.TradeDate.ToShortDateString()">Edit</a>

【讨论】:

    【解决方案2】:

    我认为您可以使用这样的标签助手(如您所提到的)来做到这一点:

    @{
        var routeData = new Dictionary<string, string>
        {
            {nameof(Model.Symbol), Model.Symbol},
            {nameof(Model.TradeDate), Model.TradeDate}
        };
    }
    

    然后:

    <a asp-page="../Edit" asp-all-route-data="@routeData">
    

    参考:Anchor Tag Helper in ASP.NET Core

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 2023-03-24
      • 2018-10-16
      • 2019-05-22
      • 2018-10-18
      • 2022-01-04
      相关资源
      最近更新 更多