0

我有一个 API 后端项目,使用 Identity Server 4 和 MVC 客户端项目制作的身份提供者。为简单起见,让我们假设我OrganizationDetailsViewModel看起来像下面所述,只有很少的属性和一组成员。SearchMetadata 是一个包含搜索、过滤和分页数据的对象。

    public class OrganizationDetailsViewModel
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public IEnumerable<MemberListDto> Members { get; set; }
        public MembersResourceParameters SearchMetadata { get; set; }
    }

成员显示在带有分页的表格中,其中有几个按钮与每个成员绑定的不同操作(例如,编辑、删除、提升)。例如,编辑会导致单独的编辑视图使用表单来更新 和 等Name属性Description。流程如下所示:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(EditOrganizationViewModel model)
        {
            if (!ModelState.IsValid)
                return View(model);

            var result = await _organizationService.Update(model.Id,
                _mapper.Map<EditOrganizationRequest>(model));

            if (result.IsFailure)
                return CreateErrorActionResult(result.Error, model);

            return RedirectToAction(actionName:"Details", controllerName:"Organization", fragment:"?organizationId=" + model.Id);
        }

_organizationService是处理与 API 后端、CreateErrorActionResult方法的通信400412将 API 返回的错误添加到 modelState 并返回的服务View(model)。对于其他错误代码,相应地采取行动。我遇到的问题是当用户单击详细信息页面上的按钮提升时,我在 MemberController 中调用此函数:

[HttpPost]
public async Task<IActionResult> Promote(Guid organizationId, Guid memberId)

如果 api 处理服务返回和错误(400),因为一些域业务规则是无效的,就像在Edit行动中一样,我想将错误添加到模型状态并返回相同的视图(这是相同的详细视图),以便显示错误信息并保持当前分页(整体表)状态,否则重定向到详细视图以重新加载更新数据(无需维护表的过滤、搜索和分页状态)。问题是,如果我想View("Details", "Organization", ...)在出现错误的情况下返回:

  1. 我需要以OrganizationDetailsViewModel某种形式将所有数据作为隐藏输入发布,而不仅仅是一个按钮。然后使用更新的 modelState 将此数据返回到视图

或者

  1. 仅发布 searchMetadata,如果 api 将返回和400' requery API for data in OrganizationDetailsViewModel`,则将其映射到视图模型并返回。

但即使我这样做了,我仍然在提升方法网址中......

控制器重定向方法只允许传递 url 和 routeValues,在查询中传递它真的很奇怪。此外,它还需要为我已经拥有的数据请求 API。我考虑过的其他选项是使用 jquery-ajax 进行调用,但我不确定,因为 MVC 正在通过code来自 Identity Server 4 的流进行授权,这意味着服务器到服务器的通信。对于使用 ajax 执行的调用,我很可能需要实现另一个implicit流程。我想出的最后一个选项是将所有OrganizationDetailsViewModel数据发布到Promote控制器方法,并在出现错误时将其添加到tempData然后字典重定向到详细信息视图并从那里读取所需的数据。但从我读过的内容来看,这是非常不可取的,因为它包括会话管理。我现在正在考虑的是使用 ajax 调用成员控制器(本地 URL)而不是 API 中的方法,但我几乎可以肯定它不会保留用户身份,并且对 API 的调用会导致未经授权,因为不会在DelegatingHandler.

4

0 回答 0