在cshtml文件中,我在Home/Details/4
中有以下javascript。4为ID。
<script>
$(document).ready(function () {
$("#checkbox").click(function () {
$.post(
"Home/Toggle",
{ checkbox: $("#checkbox").val() },
function (data) {
});
});
});
</script>
以下是控制器中的动作代码。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Toggle(bool checkbox)
{
...... // How to get ID?
var x = db.XXXX.Find(id);
如何获取ID?从一些路由数据,或Url,还是让jQuery的前端发帖传递它?
是否有可能从动作方法中获得ID而不从前端html页面传递?
首先,url中控制器名前面缺少斜杠:
"/Home/Toggle"
下一个错误是复选框值不能通过val()方法检查,但可以使用
检查$("#checkbox").is(':checked')
接下来,你必须在url后面附加id,因为它在routeconconfig .cs文件中的RegisterRoutes方法中映射为"controller/action/{id}"。
所以你最终正确的url是:"/Home/Toggle/{id}" //in your case: "/Home/Toggle/4"
Action方法中的"id"参数也缺失了。更正动作方法为:
[HttpPost]
[ValidateAntiForgeryToken]
public void Toggle(bool checkbox, int id)
{
}
完整的Jquery代码是:
$.post("/Home/Toggle/4", { checkbox: $("#checkbox").is(':checked') }, function (data) {
});
在您的脚本中,分配id
var id = '@Model.ID';
然后在回复时包含
$.post("Home/Toggle", { checkbox: $("#checkbox").val(), ID: id }, function (data) { ...
并将post方法调整为
public ActionResult Toggle(int ID, bool checkbox)
{
....
这完全取决于你的html看起来像什么?您可能希望将您的id保存为隐藏或data-some-name
到html元素。
@Html.HiddenFor(Model => Model.NameId)
或
<div class="some-class" data-id="@Model.NameId"></div>
您的操作应该接受您想要传入的两个参数(或视图模型)。
public ActionResult Toggle(bool checkbox, int id)
{
你的帖子应该是这样的。注意,这是在使用隐藏输入"store"方法时。
$.post("Home/Toggle", { checkbox: $("#checkbox").val(), id: $('.NameId').val() }, function (data) {
});
如果你的url
是这个Home/Details/4
,那么你可以得到'id'
为:-
public ActionResult Toggle(bool checkbox, int? id) //<----get 'id' this way
{}
您需要在ajax post函数中更改为id,并将id添加到Toggle函数或添加新的Toggle函数,并将id作为参数。如果你想在post函数中保持值,你需要添加一个新的路由