ASP.NET MVC中HiddenFor值无法传递到Controller的问题求助
你的代码片段
视图代码
@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; }
问题原因
- Get请求的参数传递逻辑:你用
<a>标签发起Get请求时,浏览器只会把URL中的参数传递给控制器,不会自动携带页面上的表单控件(包括HiddenFor生成的隐藏域)的值。 - 表单包裹缺失:即使是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
相关产品推荐
相关产品推荐

