【问题标题】:Calling controllers method from page with asp-action使用 asp-action 从页面调用控制器方法
【发布时间】:2019-07-01 09:18:18
【问题描述】:

无论我做什么,下面的按钮总是调用控制器的OnGetAsync() 方法,而不是所需的SetEditMode()

控制器/型号代码:

public class DetailsModel : PageModelBase
{
    private readonly ICommunicationService communicationService;

    public DetailsModel(ICommunicationService communicationService)
    {
        this.communicationService = communicationService;
    }

    public bool IsEditMode { get; set; } = false;

    public EmployeeProfileData EmployeeProfileData { get; set; }

    public async Task OnGetAsync()
    {
        this.EmployeeProfileData = await this.communicationService.GetEmployeeProfileData();
    }

    [HttpGet(nameof(SetEditMode))]
    public IActionResult SetEditMode()
    {
        this.IsEditMode = true;
        return Page();
    }
}

查看代码:

@page
@using Common.Resources
@model PersonalProfile.DetailsModel
@{
    ViewData["Title"] = TextResources.Profile;
}

<div class="row no-padding col-md-12">
    <h3 class="pl-3 mb-3 text-color-medium float-left">@TextResources.EmployeeProfileData</h3>
    @if (!Model.IsEditMode)
    {
        <div class="d-flex justify-content-start mb-2 mx-2">
            <a asp-action="SetEditMode" method="get" class="btn btn-light-green">Edit</a>
        </div>
    }
</div>

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc


    【解决方案1】:

    您正在使用 Razor 页面,而不是控制器。在您的示例中,您将 Razor 页面路由与控制器使用的基于属性的路由方法混淆了。

    为此,您可以使用Named Handler Method,它遵循On[Verb][Handler] 的约定。这是一个例子:

    public IActionResult OnGetSetEditMode()
    {
        this.IsEditMode = true;
        return Page();
    }
    

    请注意,我还删除了上面的 HttpGet 属性。

    进行此更改后,需要更新 .cshtml 文件以使用新的处理程序:

    <a asp-page-handler="SetEditMode" class="btn btn-light-green">Edit</a>
    

    请注意,在这种情况下,我还删除了 method 属性,因为 a 元素会触发 GET 请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      相关资源
      最近更新 更多