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

ASP.NET MVC中HiddenFor值无法传递到Controller的问题求助

问题:ASP.NET MVC中HiddenFor值无法传递到Get方法导致FromDate为null

你的代码片段

视图代码

@model WealthRef.Models.ViewModels

<td style="width: 100px;color:black" id="tdfromDatevalue">
if (Model != null)
{
    @Html.DropDownListFor(model => Model.DropDownModels.FromDateModels.SelectedNode,
        new SelectList(Model.DropDownModels.FromDateModels.FromDateValues, 
                       "Code", "CodeDescription"),
        new { id = "ddlFromDateValues", 
              @class = "chosen-select",
              data_placeholder = "Select Date...", 
              style = "white-space:nowrap;width:100px;" })
    @Html.HiddenFor(model => Model.FromDate, new { id = "hdnFromDate" })
}
</td>

<script type="text/javascript" language="javascript">
$("#ddlFromDateValues").on("change", function () {
    var fromDate = $(this).val();
    $("#ddlFromDateValues").val(fromDate).trigger("chosen:updated");
    $("#hdnFromDate").val(fromDate);
});
</script>
<td>
    <a class="btn" href="@Url.Action("ExportToExcel", "WealthRef")" id="btnRun"
       style="color:White" onclick="return Validate();">Run</a>
</td>
<script>
$(document).ready(function () {
    load();
});

function load() {
    $("#hdnFromDate").val($("#ddlFromDateValues").find("option:selected").val());
}
</script>

模型代码

namespace WealthRef.Models
{
    public class ViewModels
    {
        public string FromDate { get; set; }
    }
}

控制器代码

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult ExportToExcel(ViewModels model)
{
    string FromDate = model.FromDate;
}

问题原因

  1. Get请求的参数传递逻辑:你用<a>标签发起Get请求时,浏览器只会把URL中的参数传递给控制器,不会自动携带页面上的表单控件(包括HiddenFor生成的隐藏域)的值。
  2. 表单包裹缺失:即使是POST请求,当前控件也不在<form>标签内,无法被自动提交到服务器。

解决方案

方案一:改用POST表单提交(推荐)

将按钮改为表单提交按钮,用<form>包裹控件,确保隐藏域的值能被正确提交:

视图修改:

@model WealthRef.Models.ViewModels

<form action="@Url.Action("ExportToExcel", "WealthRef")" method="post">
    <td style="width: 100px;color:black" id="tdfromDatevalue">
        @if (Model != null)
        {
            @Html.DropDownListFor(model => model.DropDownModels.FromDateModels.SelectedNode,
                new SelectList(Model.DropDownModels.FromDateModels.FromDateValues, 
                               "Code", "CodeDescription"),
                new { id = "ddlFromDateValues", 
                      @class = "chosen-select",
                      data_placeholder = "Select Date...", 
                      style = "white-space:nowrap;width:100px;" })
            @Html.HiddenFor(model => model.FromDate, new { id = "hdnFromDate" })
        }
    </td>

    <td>
        <button type="submit" class="btn" id="btnRun" style="color:White" onclick="return Validate();">Run</button>
    </td>
</form>

<script type="text/javascript" language="javascript">
$("#ddlFromDateValues").on("change", function () {
    var fromDate = $(this).val();
    $("#ddlFromDateValues").val(fromDate).trigger("chosen:updated");
    $("#hdnFromDate").val(fromDate);
});

$(document).ready(function () {
    load();
});

function load() {
    $("#hdnFromDate").val($("#ddlFromDateValues").find("option:selected").val());
}
</script>

控制器修改:

[HttpPost]
public ActionResult ExportToExcel(ViewModels model)
{
    string FromDate = model.FromDate;
    // 后续业务逻辑
}

方案二:通过URL参数传递(适用于必须用Get的场景)

修改按钮点击事件,手动将隐藏域的值拼接成URL参数后跳转:

视图修改:

<!-- 替换原<a>标签 -->
<a class="btn" href="javascript:void(0)" id="btnRun" style="color:White" onclick="return ValidateAndRedirect();">Run</a>

<script>
function ValidateAndRedirect() {
    // 先执行原有验证逻辑
    if (!Validate()) {
        return false;
    }
    // 获取隐藏域的值并拼接URL
    var fromDate = $("#hdnFromDate").val();
    window.location.href = "@Url.Action("ExportToExcel", "WealthRef")?FromDate=" + encodeURIComponent(fromDate);
    return false;
}

// 保留原有JS逻辑
$("#ddlFromDateValues").on("change", function () {
    var fromDate = $(this).val();
    $("#ddlFromDateValues").val(fromDate).trigger("chosen:updated");
    $("#hdnFromDate").val(fromDate);
});

$(document).ready(function () {
    load();
});

function load() {
    $("#hdnFromDate").val($("#ddlFromDateValues").find("option:selected").val());
}
</script>

控制器保持[HttpGet]不变即可,此时model.FromDate会自动获取URL中的参数值。

方案三:直接绑定下拉框选中值(无需HiddenFor)

如果你的DropDownModels.FromDateModels.SelectedNode已经绑定了下拉框的选中值,可直接在控制器中读取该属性,省去维护隐藏域的麻烦:

补充模型定义(确保层级属性存在):

namespace WealthRef.Models
{
    public class ViewModels
    {
        public string FromDate { get; set; }
        public DropDownModels DropDownModels { get; set; } = new DropDownModels();
    }

    public class DropDownModels
    {
        public FromDateModels FromDateModels { get; set; } = new FromDateModels();
    }

    public class FromDateModels
    {
        public string SelectedNode { get; set; }
        public List<DateOption> FromDateValues { get; set; }
    }

    public class DateOption
    {
        public string Code { get; set; }
        public string CodeDescription { get; set; }
    }
}

控制器修改:

[HttpGet]
public ActionResult ExportToExcel(ViewModels model)
{
    string FromDate = model.DropDownModels.FromDateModels.SelectedNode;
    // 后续业务逻辑
}

内容的提问来源于stack exchange,提问作者Warren Mok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:52:36