【发布时间】:2015-07-22 13:22:07
【问题描述】:
我刚刚为一名不再在我工作的公司工作的员工接管了 MVC Web 应用程序。该应用程序处于早期开发阶段,我注意到一个未解决的错误,其中“提交”按钮触发了视图的相应 HttpGet ActionResult,而不是 HttpPost ActionResult。
他在视图中包含了很多 jQuery 脚本,我最初怀疑其中一个可能会导致问题,但似乎没有一个直接应用于按钮。
控制器(名为 HomeController.cs):
[HttpGet]
public ActionResult Create(string distributorObject)
{
StockLiftObjectView stockLiftObjectView = new StockLiftObjectView();
var userInfo = User.Identity.Name.GetActiveDirectoryInfo();
stockLiftObjectView.txtFirstName = userInfo.FirstName;
stockLiftObjectView.txtLastName = userInfo.LastName;
stockLiftObjectView.txtEmail = userInfo.Email;
if (stockLiftObjectView.RegionId == Guid.Empty)
{
stockLiftObjectView.RegionsList = new SelectList(_stockLiftService.GetRegions(), "Id", "RegionName");
}
return View(stockLiftObjectView);
}
[HttpPost] //Haven't done anything here yet. Ths is never reached
public ActionResult Create(string command, StockLiftObjectView stockLiftObjectView)
{
return View(stockLiftObjectView);
}
视图(命名为 Create.cshtml):
@using Html.BeginForm("Create", "Home", FormMethod.Post, new {id = createStockLift}))
{
//left out some non-useful code here
<div class="col-md-offset-2 col-md-10">
<table>
<tr><td><input type="submit" value="Create" name="command" class="btn btn-default" /></td></tr>
<tr><td><input type="submit" value="Save" name="command" class="btn btn-default" /></td></tr>
</table>
</div>
}
我认为可能有问题的视图中的脚本:
<script type="text/javascript">
function getview() {
//runs everytime page loads
$.get("@Url.Action("ShowPartial", "StockLiftAttachmentWebGrid", new List<hpd.Lynx.Web.StockLift.StockLiftAttachmentUpload>()))", function (data) {
$("#stockliftattachmentpartial").replaceWith(data);
$('#createStockLift').submit();
});
};
$("#stockliftattachmentpartial").show();
</script>
很抱歉,我的问题不是那么具体。在过去的几天里,我一直对这个问题感到困惑,并且想不出在谷歌搜索中描述这个问题的好方法。正如我之前所说,我不太熟悉 jQuery,所以我认为我可能会误解一些简单的东西。
更新:
这里只有其他时候引用 getview() 函数...
<input type="submit" value="Upload File" title="Upload" id="btnUpload" onclick="javascript: getview(); return false;" />
所以我不明白为什么它在页面加载时执行(我从不点击上传按钮)。同样,我的误解来自从不使用基本脚本。
视图中的其他脚本(似乎不适用,但以防万一)
<script>
$(function () {
$('#search').click(function () {
var distributorNumber = $("#textboxDistributorNumber").val();
var href = this.href + '?distributorNumber=' + distributorNumber;
@*var url = "@Url.Action("DistributorPartial", "Distributor")"*@
$('#dialog').dialog({
width: 1175,
height: 500,
title: 'Distributor Search',
modal: true,
open: function (event, ui) {
$(".ui-dialog-titlebar-close").hide();
$(this).load(href, function (result) {
$('.forms').submit(function () {
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (json) {
debugger;
$('#distributorViewModel_DistributorName').val(json.DistributorName);
}
});
return false;
});
});
}
});
return false;
});
});
</script>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Create</title>
<link rel="stylesheet" type="text/css" href="http://hco/css/Main.css" />
<link href="/Content/site.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.theme.css" rel="stylesheet"/>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script type="text/javascript" src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script>
<script src="/Scripts/jquery.ui.datepicker.min.js"
type="text/javascript"></script>
<script src="/Scripts/DatePickerReady.js"
type="text/javascript"></script>
<script src="/Scripts/modernizr-2.7.2.js"></script>
</head>
<body>
<form id="form1" runat="server">
<div align="center">
<table border="0" width="800" bgcolor="black" cellpadding="0" cellspacing="0">
<tr>
<td>
<table border="0" cellpadding="0" cellspacing="0" width="800px">
<tr bgcolor="black" height="60px">
<%--ADD FILLER, SRM 2/13/2012--%>
<td align="left" class="appTitle" style="width:100%;">
<!--the title was here-->
</td>
<td valign="top" align="right">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
</tr>
<tr valign="middle">
<td><input style="padding:0,0,0,0;margin:0,0,0,0;" height="20px" type="text" name="txtSearch" id="txtSearch" /></td>
<td><image height="22px" width="22px" style="background-color:White;padding:0,0,0,0;margin:0,0,0,0;" src="http://hco/images/SearchButton.jpg" alt="search" onclick="window.location='/site-search.aspx?search=' + document.all.txtSearch.value.trim()" onmouseover="this.style.cursor='hand'" /> </td>
</tr>
</table>
</td>
</tr>
<tr height="24px">
<td colspan="2" class="hcoNav">
<table border="0" cellpadding="2" cellspacing="0" height="24" width="100%">
<tr>
<td></td>
<td nowrap="nowrap" align="right">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="3" bgcolor="white" height="100%" valign="top" style="margin:0,0,0,0;">
<div style="padding:10px;">
<div id="page">
<div class="container body-content">
<form action="/Home/Create" id="createStockLift" method="post"><input name="__RequestVerificationToken" type="hidden" value="xz4YzzvUUXUP-g5KCkPRb6Ox3dZ668tjmH6fKIIwL52zSnVjX-DfV0XDNVWaKMplGPCbm664TdiJDWwoWUeO70ET9nwsPGwsRv0DVxOgDyYLMA3d3CzvEh2Vzj0ftr6O0" /> <style type="text/css">
.style1 {
height: 35px;
}
</style>
<br />
<div id="lblRequired" align="center">
<label for="lblRequired">* Required for saving</label>
</div>
<div align="center">
<div style="text-align: left; clear: none;">
<table cellpadding="2" border="1" align="center">
<tr>
<td>
<b>*CTM First Name:</b>
</td>
<td>
<input class="textboxFirstName" id="txtFirstName" name="txtFirstName" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="txtFirstName" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b>*CTM Last Name</b>
</td>
<td>
<input class="textboxLastName" id="txtLastName" name="txtLastName" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="txtLastName" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b>*CTM Email:</b>
</td>
<td>
<input class="textboxEmail" id="txtEmail" name="txtEmail" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="txtEmail" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b>*Your Region:</b>
</td>
<td>
<select data-val="true" data-val-required="The RegionId field is required." id="RegionId" na <span class="field-validation-valid" data-valmsg-for="RegionId" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b>*Distributor:</b>
</td>
<td>
<label class="control-label col-md-2" for="Distributor_Number_Search_Text:_">Distributor Number Search Text: </label>
<input id="textboxDistributorNumber" name="Distributor" type="text" value="" /> <br />
<label class="control-label col-md-2" for="Distributor_Customer_Name_Search_Text:_">Distributor Customer Name Search Text: </label>
<input id="textboxDistributorName" name="DistributorPrincipalApprovalId" type="text" value="" />
<div id="dialog" title="Basic dialog">Please wait</div>
<a href="/Distributor/DistributorPartial" id="search">Search</a>
<div id="divDistributor">
<input class="text-box single-line" id="distributorViewModel_DistributorName" name="distributorViewModel.DistributorName" type="text" value="" />
</div>
<span class="field-validation-valid" data-valmsg-for="Distributor" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b>End User:</b>
</td>
<td></td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="AccountManufactures">Account Manufactures:</label></b>
</td>
<td>
<input class="textboxAccountManufactures" id="AccountManufactures" name="AccountManufactures" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="AccountManufactures" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="InventoryRemovedFrom">Inventory removed from:</label></b>
</td>
<td>
<input class="textboxInventoyRemovedFrom" id="InventoryRemovedFrom" name="InventoryRemovedFrom" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="InventoryRemovedFrom" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="AnnualPotentialValue">*Annual potential for HPD products:</label></b>
</td>
<td>
<input class="textboxAnnualPotentialValue" data-val="true" data-val-number="The field *Annual potential for HPD products: must be a number." id="AnnualPotentialValue" name="AnnualPotentialValue" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="InventoryRemovedFrom" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="InventoryValue">*Competitive Inventory Value:</label></b>
</td>
<td>
<input class="text-box single-line" data-val="true" data-val-number="The field *Competitive Inventory Value: must be a number." id="InventoryValue" name="InventoryValue" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="InventoryValue" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="FiftyPercentMultiplier">*50% (.50) Multiplier:</label></b>
</td>
<td>
<input class="text-box single-line" data-val="true" data-val-number="The field *50% (.50) Multiplier: must be a number." id="FiftyPercentMultiplier" name="FiftyPercentMultiplier" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="FiftyPercentMultiplier" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="CreditDueValue">*CREDIT DUE DISTRIBUTOR:</label></b>
</td>
<td>
<input class="text-box single-line" data-val="true" data-val-number="The field *CREDIT DUE DISTRIBUTOR: must be a number." id="CreditDueValue" name="CreditDueValue" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="CreditDueValue" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="InitialOrderValue">*Value of the initial order:</label></b>
</td>
<td>
<input class="text-box single-line" data-val="true" data-val-number="The field *Value of the initial order: must be a number." id="InitialOrderValue" name="InitialOrderValue" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="InitialOrderValue" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="StockLiftMaterialScrappedDate">Stocklift material was scrapped(Date):</label></b>
</td>
<td>
<input class="text-box single-line" data-val="true" data-val-date="The field Stocklift material was scrapped(Date): must be a date." id="StockLiftMaterialScrappedDate" name="StockLiftMaterialScrappedDate" type="datetime" value="" />
<span class="field-validation-valid" data-valmsg-for="StockLiftMaterialScrappedDate" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="DistributorPrincipalApprovalId">Distributor Principal (Signature):</label></b>
</td>
<td>
<input class="text-box single-line" id="DistributorPrincipalApprovalId" name="DistributorPrincipalApprovalId" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="DistributorPrincipalApprovalId" data-valmsg-replace="true"></span>
<b><label class="control-label col-md-2" for="DistributorPrincipalApprovalDate">Date:</label></b>
<input class="text-box single-line" data-val="true" data-val-date="The field Date: must be a date." id="DistributorPrincipalApprovalDate" name="DistributorPrincipalApprovalDate" type="datetime" value="" />
<span class="field-validation-valid" data-valmsg-for="DistributorPrincipalApprovalDate" data-valmsg-replace="true"></span>
<div id="distributorDiv">
</div>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="Comments">Comments:</label></b>
</td>
<td>
<textarea class="textboxComments" cols="55" id="Comments" name="Comments" rows="10">
</textarea>
<span class="field-validation-valid" data-valmsg-for="Comments" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="AdministrativeNotes">Administrative Notes:</label></b>
</td>
<td>
<textarea class="textboxAdministrativeNotes" cols="55" id="AdministrativeNotes" name="AdministrativeNotes" rows="10">
</textarea>
<span class="field-validation-valid" data-valmsg-for="AdministrativeNotes" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="RejectedReason">Rejected Reason:</label></b>
</td>
<td>
<textarea class="textboxRejectedReason" cols="55" id="RejectedReason" name="RejectedReason" rows="10">
</textarea>
<span class="field-validation-valid" data-valmsg-for="RejectedReason" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<b><label class="control-label col-md-2" for="FileName">Stocklift Attachment:</label></b>
</td>
<td>
<input type="file" name="files" value="" multiple="multiple" />
<input type="submit" value="Upload File" title="Upload" id="btnUpload" onclick="javascript: getview(); return false;" />
<div style="color:Red;font-size:14px"></div>
</td>
</tr>
</table>
</div>
</div>
<div id="stockliftattachmentpartial">
</div>
<div class="col-md-offset-2 col-md-10">
<table>
<tr><td><input type="submit" value="Create" name="command" class="btn btn-default" /></td></tr>
<tr><td><input type="submit" value="Save" name="command" class="btn btn-default" /></td></tr>
</table>
</div>
</form><table>
<tr><td> </td></tr>
<tr>
<td align="left"><a href="/">Back to List</a></td>
</tr>
</table>
</div>
</div>
</div>
</td>
</table>
</td>
</tr>
</table>
</div>
</form>
<script type="text/javascript">
function getview() {
$.get("/StockLiftAttachmentWebGrid/ShowPartial?Capacity=0&Count=0)", function (data) {
$("#stockliftattachmentpartial").replaceWith(data);
$('#createStockLift').submit();
});
};
$("#stockliftattachmentpartial").show();
//{
// $.get("<~/Controllers/StockLiftAttachmentWebGridController/ShowPartial()>", function (data) { $("#stockliftattachmentpartial").html(data); }
//)
//}
//$('#stockliftattachmentpartial').load('/Views/StockLiftAttachmentWebGrid/StockLiftAttachmentWebGrid');
</script>
<script>
// var $loading = $('#divDistributor').hide();
$(function () {
$('#search').click(function () {
var distributorNumber = $("#textboxDistributorNumber").val();
var href = this.href + '?distributorNumber=' + distributorNumber;
$('#dialog').dialog({
width: 1175,
height: 500,
title: 'Distributor Search',
modal: true,
open: function (event, ui) {
$(".ui-dialog-titlebar-close").hide();
$(this).load(href, function (result) {
$('.forms').submit(function () {
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (json) {
//$('#dialog').dialog('close');
// $loading.show();
debugger;
$('#distributorViewModel_DistributorName').val(json.DistributorName);
}
});
return false;
});
});
}
});
return false;
});
});
</script>
【问题讨论】:
-
并不是说它看起来很相关,但是什么在调用
getview()函数?[HttpGet]不应该能够从post调用。是否有任何其他脚本正在运行(移动、SPA 或 ajax 验证)? -
GET 函数应该调用“创建”操作而不是。
-
您能否提供页面的整个输出 HTML(例如从浏览器保存的)?这将让我们快速发现任何潜在问题,因为显示的 sn-ps 没有任何相关线索:)
-
@TrueBlueAussie 不。这是仅有的两个 Create 动作。我在调试时用断点确认 Get 方法确实被命中了! ://
-
该更新有帮助:您显示的新代码正在连接一个提交处理程序,它将接管提交过程。它不会按原样工作,因为
serialise()不会保留按下的按钮!如果您可以提供有助于发现 jQuery 问题的原始页面输出 HTML。
标签: jquery asp.net-mvc html razor