C# 如何使asp.net mvc复选框触发操作?
我想在有人选中代表行中位字段的框时更新数据库。我一直在回避这个问题: 以下是我在cshtml文件中的代码:C# 如何使asp.net mvc复选框触发操作?,c#,asp.net-mvc,checkbox,C#,Asp.net Mvc,Checkbox,我想在有人选中代表行中位字段的框时更新数据库。我一直在回避这个问题: 以下是我在cshtml文件中的代码: @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Macro_Name) </td> <td> @Html.CheckBoxFor(modelItem => item.Cla
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Macro_Name)
</td>
<td>
@Html.CheckBoxFor(modelItem => item.Claimed, new { id = item.Macro_Name, data_url = Url.Action("ToggleClaim", "MacroStatus")})
</td>
<td>
@Html.DisplayFor(modelItem => item.Date_Claimed)
</td>
<td>
@Html.DisplayFor(modelItem => item.Username)
</td>
<td>
@Html.DisplayFor(modelItem => item.Finished)
</td>
<td>
@Html.DisplayFor(modelItem => item.Date_Completed)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Macro_Name }) |
@Html.ActionLink("Details", "Details", new { id = item.Macro_Name }) |
@Html.ActionLink("Delete", "Delete", new { id = item.Macro_Name })
</td>
</tr>
}
但是,当我选中或取消选中该框时,ToggleClaim没有运行。没有编译错误。这是我第一次尝试asp.net mvc,我做错了什么?原因是当取消选中复选框时,表单被提交;未提交与复选框相关的表单字段。您必须使用JavaScript添加
隐藏的变量,如中所述,或者在选中复选框时点击Ajax 关键点是在复选框更改时发送ajax请求
正如在的评论中提到的,您可以使用许多不同的方式触发该操作。例如,将此脚本放入代码中:
<script>
$(function () {
$('#Claimed').change(function () {
$.ajax({
url: '/ToggleClaim/MacroStatus/@item.Macro_Name',
cache: false,
method: 'GET',
success: function (data) { alert('success'); },
error: function () { alert('error'); }
});
});
});
</script>
$(函数(){
$(“#声明”)。更改(函数(){
$.ajax({
url:“/ToggleClaim/MacroStatus/@item.Macro_Name”,
cache:false,
方法:“GET”,
成功:函数(数据){alert('success');},
错误:函数(){alert('error');}
});
});
});
并通过以下方式更正复选框代码:
<td>
@Html.CheckBoxFor(modelItem => item.Claimed)
</td>
@CheckBoxFor(modelItem=>item.Claimed)
上述代码在每次选中或取消选中复选框时都会触发该操作,您只需检查复选框是否已选中,然后发送ajax请求。您将需要ajax来完成此操作。
首先,在复选框中添加一个类,这样你就有了一个钩子来附加你的点击事件
@Html.CheckBoxFor(modelItem=>item.Claimed,新的{id=item.Macro\u Name,@class=“toggle”data\u url=url.Action(“ToggleClaim”,“MacroStatus”)}
现在添加javascript
@section scripts {
<script>
$(function() {
$('.toggle').change(function() {
var self = $(this);
var url = self.data('url');
var id = self.attr('id');
var value = self.prop('checked');
$.ajax({
url: url,
data: { id: id },
type: 'POST',
success: function(response) {
alert(response);
}
});
});
});
</script>
}
@节脚本{
$(函数(){
$('.toggle').change(函数(){
var self=$(这是);
var url=self.data('url');
var id=self.attr('id');
var值=self.prop('已检查');
$.ajax({
url:url,
数据:{id:id},
键入:“POST”,
成功:功能(响应){
警报(响应);
}
});
});
});
}
这可以在不使用脚本和带有标准控制器的锚点的情况下完成
在布局页面中添加指向css文件的链接
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css"
integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr"
crossorigin="anonymous">
在视图或显示模板中添加定位点
<a asp-controller="MacroStatus" asp-action="ToggleClaim" asp-route-
id="item.Macro_Name">
@if (item.Claimed)
{
<span class="fas fa-toggle-on fa-2x"></span>
}
else
{
<span class="fas fa-toggle-off fa-2x"></span>
}
</a>
@如果(索赔项目)
{
}
其他的
{
}
它看起来像一个复选框,可以单击,并且如果在一个视图中有多个实例(例如,如果您正在使用对象数组的显示模板),它也非常有用
通过使用开关打开/关闭部件的组件,可以使上述内容变得非常干净且可重复使用
<vc:toggle-on-off toggle="@item.Claimed"></vc:toggle-on-off>
然后它看起来像:
<a asp-controller="MacroStatus" asp-action="ToggleClaim" asp-route-
id="item.Macro_Name">
<vc:toggle-on-off toggle="@item.Claimed"></vc:toggle-on-off>
</a>
数据url
属性现在只包含一些url。需要一些Javascript来使用它。有很多方法可以实现这一点,但是当您选中该框时,您需要对服务器端点(可能是Web API方法,因为您使用的是ASP.net MVC)执行AJAX调用。“快速脏”的答案是使用jQuery选择器复选框,并使用$([selector]).change(function(){})注册函数;您还可以将复选框绑定到kendo viewmodel函数或任何其他方法。您也可以查看此处:@EricBurcham复选框更改时,关键点是发送ajax请求。@RezaAghaei-我认为在我的评论中这一点很清楚,但您完全正确。@class=“toggle”在此处给我一个语法错误。这是一个有效的关键字吗?很抱歉,类是一个保留字,请使用@-@class=“toggle”
hi如何在Ajax成功/失败时更新行来转义它。例如,如果状态
是行中的列。如果Approved/Rejected是一个带有注释的单选按钮,那么如果我想--切换行的颜色,并更新行中status的值。@EricBurcham Thank you:)要像您试图做的那样传递正确的宏名称,您必须将其放入foreach循环中。您不应该这样做。@JB06哪个宏名?哪个环路?做什么?;)除非你把这个放在foreach中,否则你的url字符串将无法工作,否则你将如何使用@item?非常好的一点!我还从未见过那个循环;)这样我就不用Id了!
<a asp-controller="MacroStatus" asp-action="ToggleClaim" asp-route-
id="item.Macro_Name">
<vc:toggle-on-off toggle="@item.Claimed"></vc:toggle-on-off>
</a>