使用asp-action

时间:2019-02-07 09:36:11

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

无论我做什么,下面的按钮总是调用控制器的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>

1 个答案:

答案 0 :(得分:2)

您正在使用Razor Page,而不是Controller。在您的示例中,您将Razor Pages路由与Controllers所使用的基于属性的路由方法相混淆。

为此,您可以使用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个请求。