You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:29:06