MVC .NET 表单提交未命中控制器操作
Posted
技术标签:
【中文标题】MVC .NET 表单提交未命中控制器操作【英文标题】:MVC .NET Form Submission not hitting Controller Action 【发布时间】:2018-07-18 21:04:21 【问题描述】:我有一个表单可以在如下视图中创建一个对象:
@using (html.BeginForm("Create", "Request", FormMethod.Post, new id = "createForm" ))
@Html.HiddenFor(model => model.RequestDate)
@Html.HiddenFor(model => model.Requester)
<div class="form-horizontal col-md-5">
@Html.ValidationSummary(true, "", new @class = "text-danger" )
<div class="form-group">
<div class="mui-select">
@Html.DropDownListFor(model => model.CategoryId, new SelectList(ViewBag.Categories, "Key", "Value"))
<label>Category</label>
</div>
@Html.ValidationMessageFor(model => model.CategoryId, "", new @class = "text-danger" )
</div>
<div class="form-group">
<div class="mui-textfield mui-textfield--float-label">
@Html.TextBoxFor(model => model.Requester, new disable = "disabled", @readonly = "readonly" )
<label>Requester</label>
</div>
</div>
<div class="form-group">
<div class="mui-textfield mui-textfield--float-label">
@Html.TextBoxFor(model => model.RequestDate, new @id = "txtRequestDate" )
<label>Request Date</label>
</div>
</div>
<div class="form-group">
<div class="mui-select">
@Html.DropDownListFor(model => model.ParentRequestId, new SelectList(ViewBag.Requests, "Key", "Value"))
<label>Parent Request</label>
</div>
@Html.ValidationMessageFor(model => model.ParentRequestId, "", new @class = "text-danger" )
</div>
</div>
<div class="form-horizontal col-md-5" style="float:right;">
<div class="form-group">
<div class="mui-select">
@Html.EnumDropDownListFor(model => model.Destination, "Select Destination Site...", new type = "text" )
<label>Destination Site</label>
</div>
</div>
<div class="form-group">
<div class="mui-textfield mui-textfield--float-label">
@Html.TextBoxFor(model => model.ETDDate, new @id = "txtETDDate" )
<label>ETD Date</label>
</div>
</div>
<div class="form-group">
<div class="mui-select">
@Html.EnumDropDownListFor(model => model.ReasonCode, "Select Reason...", new type = "text" )
<label>Reason Code</label>
</div>
</div>
<div class="form-group">
<div class="mui-textfield mui-textfield--float-label">
@Html.EditorFor(model => model.Reason, null)
<label>Reason</label>
</div>
</div>
</div>
如您所见,这应该以 POST 请求的形式点击 /Request/Create
。
我在表单之外有一个按钮:
<li id="new-menu" class="top-level">
<a href="#" id="saveBtn">Save</a>
</li>
这通过 jquery 提交:
$('#saveBtn').on('click', function ()
$('#createForm').submit();
);
我在RequestController
中的控制器方法是:
[HttpPost]
public async Task<ActionResult> Create(Request request)
//DO STUFF
return RedirectToAction("Detail", new id = request.Id );
但是在此方法的第一行设置断点,并没有给我任何东西,因为它没有触发动作。
我已经在开发者工具的网络选项卡中检查了调用,并且请求的主体很好,它已经正确获取了所有细节,因此它与操作所期望的Request
对象相匹配。它还返回一个200
响应代码,但响应本身没有任何内容。
我不确定如何进一步调试并找到实际问题。
有人有什么建议吗?
在此先感谢 :)
** 编辑 **
为了澄清,我对此的回应是浏览器中的一个空白页面,但显然我知道它没有使用断点访问控制器。
【问题讨论】:
【参考方案1】:好的,所以我已经解决了这个问题,并将在此处发布答案,以防它帮助其他人:
在我的Request
模型中,我有一个名为 Value 的字段,其 getter 如下:
[NotMapped]
[DisplayFormat(DataFormatString = "0:C", ApplyFormatInEditMode = false)]
public decimal Value
get
return Lines.Sum(l => l.Value);
但是,在创建时,请求没有任何行,因此失败了。
因此,将其更改为以下可以通过在某种意义上为其赋予默认值来解决问题:
[NotMapped]
[DisplayFormat(DataFormatString = "0:C", ApplyFormatInEditMode = false)]
public decimal Value
get
return Lines != null && Lines.Count() > 0 ? Lines.Sum(l => l.Value) : 0;
【讨论】:
以上是关于MVC .NET 表单提交未命中控制器操作的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 表单提交多层子级实体集合数据到控制器中