ASP.NET MVC如何将PartialView中设置的值传递到控制器
问题根因
你在PartialView的服务端代码中声明ContactForm对象并赋值Message属性的操作,仅发生在服务端渲染视图阶段,该值仅存在于服务端临时上下文,没有被渲染为前端表单可提交的元素。浏览器提交表单时只会携带页面中<input>、<textarea>、<select>等表单标签的内容,因此控制器无法获取到未输出到页面的Message值。
解决方案
最常用的实现方式是将Message值渲染为表单隐藏域,提交时自动跟随表单参数传递到控制器,操作步骤如下:
- 调整你的PartialView代码,在赋值后添加隐藏域绑定:
@{ Layout = "master.cshtml"; ContactForm form= new ContactForm(); form.Message = "Thank you, we shall be in touch"; } <!-- 新增隐藏域,name属性需和模型的Message属性名完全匹配,保证模型绑定正常识别 --> @Html.Hidden("Message", form.Message)
如果你的主表单已经强类型绑定了ContactForm模型,无需在PartialView中单独实例化对象,直接复用外层模型即可,代码可以简化为:
@model ContactForm @{ Layout = "master.cshtml"; Model.Message = "Thank you, we shall be in touch"; } @Html.HiddenFor(m => m.Message)
额外说明
- 你对ViewBag的理解是正确的,它是控制器向视图传递临时数据的容器,无法实现视图向控制器的反向数据传递,视图到控制器的传值只能通过表单提交、路由参数、QueryString等前端发起请求时携带的参数实现。
- 如果需要适配不同表单的差异化
Message需求,也可以在渲染PartialView时通过ViewData传递自定义值,避免每个PartialView硬编码内容,灵活性更高:
主视图渲染PartialView时传入参数:
PartialView中读取参数绑定:@Html.Partial("ContactFormPartial", new ViewDataDictionary { {"CustomMessage", "表单A的提示文案"} })@Html.Hidden("Message", ViewData["CustomMessage"])
内容的提问来源于stack exchange,提问作者Computer
相关产品推荐
相关产品推荐

