ASP.NET MVC提交表单时模型为null及URL参数丢失问题求助
问题解决:MVC表单提交模型为null及验证后Id丢失
一、模型提交为null的原因及修复
MVC的模型绑定依赖表单控件的name属性与模型属性名完全匹配,你的视图中所有输入控件的name都和模型属性不一致:
- Ticker对应输入框name是
Ticker_Box,模型属性是Ticker - TradeDirection对应输入框name是
Trade_Direction,模型属性是TradeDirection - TradeDescription对应输入框name是
Trade_Description,模型属性是TradeDescription
修复方案:使用强类型辅助方法生成输入控件
替换视图中的Html.TextBox为Html.TextBoxFor,自动匹配模型属性名,同时保留模型值:
修改后的视图表单部分:
@using (Html.BeginForm("Create", "TradeIdea", FormMethod.Post)) { <table align="center"> <tr> <td align="center"> @Html.LabelFor(m => m.Ticker) @Html.TextBoxFor(m => m.Ticker) </td> </tr> <tr> <td align="center"> @Html.LabelFor(m => m.TradeDirection) @Html.TextBoxFor(m => m.TradeDirection) </td> </tr> <tr> <td align="center"> @Html.LabelFor(m => m.TradeDescription) @Html.TextBoxFor(m => m.TradeDescription) </td> </tr> <tr> <td align="center"> <input type="submit" value="Submit Idea" id="btnSubmit" /> </td> </tr> </table> }
二、ModelState验证不通过时Id丢失的原因及修复
GET请求的Create方法需要Id参数,但你没有将这个Id传递到表单中,也没有在模型中保存该值。当验证不通过返回视图时,Id没有被携带,导致URL中丢失。
修复方案:将Id存入模型并通过隐藏字段提交
- 修改模型类,添加
Id属性:
namespace StockCenter.Models { public class CreateTradeIdeaModel { public int Id { get; set; } // 添加Id属性 [Required] public string Ticker { get; set; } [Required] public string TradeDirection { get; set; } [Required] public string TradeDescription { get; set; } } }
- 修改GET的Create方法,为模型赋值Id:
public ActionResult Create(int Id) { //var dailyOptionRecord = new OptionHeaderService().GetById(Id); var model = new Models.CreateTradeIdeaModel(); model.Id = Id; // 赋值Id model.Ticker = "something"; return View(model); }
- 修改视图,添加隐藏字段保存Id:
在表单内添加(比如放在表格第一行或任意位置):
@Html.HiddenFor(m => m.Id)
修改后的完整视图:
@using Kendo.Mvc.UI @model StockCenter.Models.CreateTradeIdeaModel @{ ViewBag.Title = "Create"; Layout = "~/Views/Shared/_Layout.cshtml"; } @using (Html.BeginForm("Create", "TradeIdea", FormMethod.Post)) { @Html.HiddenFor(m => m.Id) <!-- 添加隐藏字段 --> <table align="center"> <tr> <td align="center"> @Html.LabelFor(m => m.Ticker) @Html.TextBoxFor(m => m.Ticker) </td> </tr> <tr> <td align="center"> @Html.LabelFor(m => m.TradeDirection) @Html.TextBoxFor(m => m.TradeDirection) </td> </tr> <tr> <td align="center"> @Html.LabelFor(m => m.TradeDescription) @Html.TextBoxFor(m => m.TradeDescription) </td> </tr> <tr> <td align="center"> <input type="submit" value="Submit Idea" id="btnSubmit" /> </td> </tr> </table> }
这样修改后,表单提交时模型会正确绑定,且验证不通过返回视图时,Id会通过隐藏字段保留,解决URL中Id丢失的问题。
内容的提问来源于stack exchange,提问作者user1257758
相关产品推荐
相关产品推荐

