Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使asp.net mvc复选框触发操作?_C#_Asp.net Mvc_Checkbox - Fatal编程技术网

C# 如何使asp.net mvc复选框触发操作?

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

我想在有人选中代表行中位字段的框时更新数据库。我一直在回避这个问题: 以下是我在cshtml文件中的代码:

@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>