这是我之前没遇到的问题。
我正在研究一个MVC4项目。我正在使用asp按钮控件,因为没有可用于按钮的Html Helper(re:There's no @Html.Button !)。我的按钮代码是:
<td><asp:Button ID="ButtonUndo" runat="server" Text="Undo"
OnClick="ButtonUndo_Click" AutoPostBack="true"/></td>
我转到Designer选项卡并单击了生成事件处理程序的按钮:
protected void ButtonUndo_Click(object sender, EventArgs e)
{
RRSPSqlEntities db = new RRSPSqlEntities();
int id = (int)ViewData["ClientId"];
var updateAddress = (from a in db.Address
where a.PersonId == id
select a).SingleOrDefault();
updateAddress.Deleted = false;
db.SaveChanges();
}
我应该补充说,此代码已添加到包含在脚本标记中的同一.aspx页面中。在本节中还有Page_Load方法。事件处理程序不在Page_Load中。
当我设置断点并逐步执行代码时,发现了问题。单击我的按钮显示它根本没有点击我的事件处理程序。我不知道为什么会这样,特别是ASP在设计模式下单击按钮创建了事件。
答案 0 :(得分:5)
单击我的按钮显示它根本没有点击我的事件处理程序。
这并不奇怪。 ASP.NET MVC使用完全不同的事件模型(即它没有像Web表单那样)。但是,你要做的事情非常直截了当。在你的控制器中构建一个新方法,我们称之为Undo
:
public ActionResult Undo(int id)
{
RRSPSqlEntities db = new RRSPSqlEntities();
var updateAddress = (from a in db.Address
where a.PersonId == id
select a).SingleOrDefault();
updateAddress.Deleted = false;
db.SaveChanges();
return View("{insert the original action name here}");
}
然后在你的标记中,只需像这样标记input
:
<form method="POST" action="/ControllerName/Undo">
@Html.HiddenFor(Model.Id)
<input type="submit" value="Undo" />
</form>
您所在的Model
的{{1}}包含一个属性,我称之为View
,即您希望传递给Id
id
Undo
1}}。
答案 1 :(得分:0)
我通常更喜欢进行ajax调用。你可以尝试:
<button type="button" class="button" onclick="ButtonUndo();" />
表格形式:
<script>
function ButtonUndo() {
$.ajax({
type: 'POST',
url: '/controller/action',
data: 'PersonID=' + ID,
dataType: 'json',
cache: false,
success: function (result) {
//do stuff here
},
error: function () {
//do error stuff here
}
});
}
</script>
控制器:
[HttpPost]
public ActionResult Action(int PersonID)
{
//Do your stuff here
return new JsonResult { result = "something" };
}
(对不起任何拼写错误或语法错误......我从我们在项目中使用的现有代码中提取。)