C#开发的Bot Framework聊天机器人如何通过后置代码更新任务模块
问题解答
你的需求完全可以实现。你用ASP.NET服务器控件的写法无效,是因为Teams的任务模块运行环境不支持Web Forms的PostBack回发机制,那套逻辑依赖ASP.NET的视图状态和表单同步提交,嵌入在Teams中的页面不会触发对应的后端绑定事件。
推荐实现方案(满足调用C#后端逻辑、更新表单的需求)
不用走任务模块提交的复杂逻辑,直接用AJAX调用后端接口拿到数据后前端填充表单即可,实现步骤如下:
- 把你原来的
<asp:Button>服务器控件替换为普通HTML按钮,不要用runat="server"属性 - 给按钮绑定前端点击事件,用fetch发起异步请求调用你Razor Pages后端的处理方法
- 后端C#方法处理完逻辑返回需要填充的数据,前端拿到数据后直接操作DOM给对应文本框赋值
对应代码示例:
.cshtml 页面代码
<!-- 加防伪标记供AJAX请求校验 --> @Html.AntiForgeryToken() <input type="text" id="targetInput" placeholder="待填充的文本框" /> <button id="btnOperate" type="button">执行操作并填充</button> <script> document.getElementById('btnOperate').addEventListener('click', async () => { // 发起请求调用后端C#方法 const response = await fetch('./?handler=OperateAndGetData', { method: 'POST', headers: { 'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]').value } }); const result = await response.json(); // 填充文本框 document.getElementById('targetInput').value = result.FillContent; }); </script>
.cshtml.cs 后置代码
public class YourPageModel : PageModel { public IActionResult OnPostOperateAndGetData() { // 这里写你原本要在btnLogin_Click中执行的所有C#逻辑 var fillContent = "经过业务逻辑计算得到的填充值"; return new JsonResult(new { FillContent = fillContent }); } }
如果你需要整体更新任务模块的全部内容
如果你的场景需要替换整个任务模块的页面/布局,再用微软文档提到的任务模块响应逻辑:
- 页面中引入Teams JS SDK,点击按钮时调用
microsoftTeams.tasks.submitTask()方法把需要的参数传给机器人后端 - 机器人的
OnTeamsTaskModuleSubmitAsync方法中处理完业务逻辑后,返回TaskModuleContinueResponse类型的响应,携带新的任务模块配置信息,Teams会自动更新当前已打开的任务模块内容,不需要用户重新触发打开流程。
对应机器人端C#代码示例:
protected override async Task<TaskModuleResponse> OnTeamsTaskModuleSubmitAsync(ITurnContext<IInvokeActivity> turnContext, TaskModuleRequest taskModuleRequest, CancellationToken cancellationToken) { // 处理提交的业务逻辑 var newTaskInfo = new TaskModuleTaskInfo { Url = "新的任务模块页面地址(可携带自定义参数)", Title = "更新后的任务模块标题", Height = 350, Width = 450 }; return new TaskModuleResponse { Task = new TaskModuleContinueResponse { Value = newTaskInfo } }; }
内容的提问来源于stack exchange,提问作者SendETHToThisAddress
相关产品推荐
相关产品推荐

