.NET Core中如何通过Html.BeginForm()将ChangedRole值传递至控制器
解决表单提交时向控制器传递ChangedRole值的问题
看起来你已经有了核心思路——用隐藏输入框存储选中的角色值再提交表单,只是在几个细节上需要调整,我来帮你一步步修正:
1. 确保隐藏输入框在表单范围内(核心!)
你代码里的#UserMainRole必须放在Html.BeginForm()的标签内部,否则表单提交时根本不会携带这个值。同时,一定要给输入框加上name属性——表单是通过name而不是id来识别要传递的参数的。修改后的视图代码如下:
@using (Html.BeginForm("ChangeRole", "Login", null, FormMethod.Post, null, new { id = "SubmitRole" })) { @Html.AntiForgeryToken() <!-- 把隐藏输入框放在表单内,添加name属性 --> <input type="hidden" id="UserMainRole" name="UserMainRole" /> @foreach (var item in (@HttpContextAccessor.HttpContext.Session.GetObjectFromJson<UserRoleLevelDetails>("GetAllUsersList"))) { // 假设vr是你当前循环里的角色变量,比如item.Role_Level_Name var vr = item.Role_Level_Name; // 去掉冗余的@符号,Razor代码块内不需要重复加 if (vr != HttpContextAccessor.HttpContext.Session.GetString("Role")) { <a class="@vr" id="@item.Role_Level_Name" onclick="Change_Role(this)">@vr</a><br /> } //.. } }
2. 优化JavaScript函数的执行顺序
你的JS里e.preventDefault()的位置有点问题,应该先阻止a标签的默认跳转行为,再处理表单提交,否则可能会出现跳转干扰提交的情况:
function Change_Role(e) { e.preventDefault(); // 先阻止a标签默认的跳转行为 var ChangedRole = $(e).attr('class'); $('#UserMainRole').val(ChangedRole); $("#SubmitRole").submit(); };
3. 控制器端正确接收参数
确保你的LoginController中的ChangeRole方法参数名和输入框的name完全一致,这样模型绑定才能正常工作:
[HttpPost] [ValidateAntiForgeryToken] public IActionResult ChangeRole(string UserMainRole) { // 这里就能拿到你选中的ChangedRole值了 // 接下来写你的角色变更业务逻辑 return RedirectToAction("YourTargetAction"); }
如果你的业务需要更多参数,也可以定义一个视图模型来接收:
public class RoleChangeRequest { public string UserMainRole { get; set; } // 可以添加其他需要传递的属性 } // 控制器方法改成这样 [HttpPost] [ValidateAntiForgeryToken] public IActionResult ChangeRole(RoleChangeRequest request) { var changedRole = request.UserMainRole; // 业务逻辑处理 return RedirectToAction("YourTargetAction"); }
可选:不用隐藏输入框的替代方案
如果不想用隐藏输入框,也可以在JS里直接修改表单的action,把角色值作为查询参数拼进去(不过Post请求更推荐用表单控件传递参数):
function Change_Role(e) { e.preventDefault(); var ChangedRole = $(e).attr('class'); var form = $("#SubmitRole"); // 给表单action追加参数 form.attr('action', `${form.attr('action')}?UserMainRole=${ChangedRole}`); form.submit(); }
这种方式控制器同样可以通过string UserMainRole参数接收值,不过隐藏输入框的方式更符合Post请求的最佳实践。
内容的提问来源于stack exchange,提问作者user18243370
相关产品推荐
相关产品推荐

