代码之家  ›  专栏  ›  技术社区  ›  stefan.stt

使用ASP操作从页调用控制器方法

  •  1
  • stefan.stt  · 技术社区  · 7 年前

    不管我做什么,下面的按钮总是叫 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 回复  |  直到 7 年前
        1
  •  2
  •   Kirk Larkin    7 年前

    您使用的是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 设计要求。

    推荐文章