Asp.net mvc 单击复选框上的自动回发页面
这一定很简单,但我已经研究了几天如何通过单击复选框来更改行值。我想要的是更改一列的值,单击复选框并保持复选框处于选中状态(如果为真)。否则,如果为false,它将保持未选中状态。下面是一个屏幕截图,当一行的公共Post列值为“No”时,复选框将保持未选中状态。当我选中复选框时,反之则表示它将保持选中状态,值将为“是” 我不知道如何准确地做到这一点,我看到了一些处理这种情况的问题或链接: 但我想有一些更先进的想法来实现它,因为它与ASP.NET Web表单完全不同。如果专家们能分享一些想法或有助于理解的链接,我将不胜感激。谢谢 顺便说一下,下面是我正在学习的课程。我不确定如何处理来自控制器的回发,到目前为止,下面是使用Ajax完成的。但它不起作用或不更新: 型号:Asp.net mvc 单击复选框上的自动回发页面,asp.net-mvc,checkbox,postback,Asp.net Mvc,Checkbox,Postback,这一定很简单,但我已经研究了几天如何通过单击复选框来更改行值。我想要的是更改一列的值,单击复选框并保持复选框处于选中状态(如果为真)。否则,如果为false,它将保持未选中状态。下面是一个屏幕截图,当一行的公共Post列值为“No”时,复选框将保持未选中状态。当我选中复选框时,反之则表示它将保持选中状态,值将为“是” 我不知道如何准确地做到这一点,我看到了一些处理这种情况的问题或链接: 但我想有一些更先进的想法来实现它,因为它与ASP.NET Web表单完全不同。如果专家们能分享一些想法或
public class Product
{
[Key]
public int Id { get; set; }
[Required(ErrorMessage = "Details can't be blank")]
[DataType(DataType.Text)]
public string Name{ get; set; }
public string Date_Posted { get; set; }
public string Time_Posted { get; set; }
public string Time_Edited { get; set; }
public string Date_Edited { get; set; }
public string Public { get; set; }
public double Price { get; set; }
public int User_Id { get; set; }
public bool Status { get; set; } //This is bit column that I am trying to change and not sure how to handle this from controller
public List<Product> allLists;
public IEnumerable<Product> Items;
public Pager Pager;
}
视图-主页/索引:
@model OurFirstWebApp.Models.Product
@{
ViewBag.Title = "Index";
var username = User.Identity.Name;
}
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script language="javascript">
$(function () {
$('.toggle').change(function () {
//alert("Hello");
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);
$("#divData").load(window.location + " #divData");
}
});
});
});
@model-OurFirstWebApp.Models.Product
@{
ViewBag.Title=“Index”;
var username=User.Identity.Name;
}
$(函数(){
$('.toggle').change(函数(){
//警惕(“你好”);
var self=$(这是);
var url=self.data('url');
var id=self.attr('id');
//var值=self.prop('已检查');
$.ajax({
url:url,
数据:{id:id},
键入:“POST”,
成功:功能(响应){
警报(响应);
$(“#divData”).load(window.location+“#divData”);
}
});
});
});
身份证件
产品
公布的时间
时间编辑
@如果(@User.Identity.IsAuthenticated)
{
地位
编辑
删除
公职
}
@foreach(Model.Items中的var项)
{
@DisplayFor(modeleItem=>item.Id)
@DisplayFor(modelItem=>item.Name)
@DisplayFor(modelItem=>item.Time\u发布)
@DisplayFor(modelItem=>item.Time\u编辑)
@如果(@User.Identity.IsAuthenticated)
{
@CheckBoxFor(modelItem=>item.Status,new{id=item.id,@class=“toggle”,data\u url=url.Action(“CheckValue”,“Home”)})
@DisplayFor(modeleItem=>item.Public)
}
}
您的属性bool Status
和string Public
令人困惑,在数据库中有两个字段表示相同的内容是个坏主意。你应该有一个单一的财产(比如说)
复选框本身应该足以表示该值,但如果确实需要额外的列,则在视图模型中添加额外的属性(例如)
或者更好,为输出“是”或“否”的项目创建一个DisplayTemplate
接下来,您无法使用foreach
循环正确绑定到集合模型(请参阅以了解更多详细信息),您需要使用for
循环或自定义EditorTemplate
for type ofProduct
for(int i = 0; i < Model.Items.Count; i++)
{
<tr>
<td>@Html.DisplayFor(m => m.Items[i].Id)</td> // see notes below
....
<td>@Html.CheckBoxFor(m => m.Items[i].IsPublicPost, new { @class = "post-checkbox", data_id = Model.Items[i].Id })</td>
// If you really want the extra column
<td class="post-text">@Html.DisplayFor(m => m.Items[i].PublicPostDisplayText)</td>
</tr>
}
最后介绍了控制器的设计方法
[HttpPost]
public JsonResult UpdatePublicPostStatus(int id, bool isPublicPost)
{
MainDbContext db = new MainDbContext();
var product = db.Product.Find(id);
if (product != null) // always check
{
product.IsPublicPost = isPublicPost;
db.Entry(product).State = EntityState.Modified;
db.SaveChanges();
return Json(true);
}
// If something went wrong, e.g. an exception, then return Json(null);
}
旁注
id
属性是无效的html(不要在内部添加)
循环(除非它们是唯一的)td:n子项(1){
文本对齐:居中;}
if(ModelState.IsValid)
是毫无意义的(并且将始终返回
true
),因为您没有发布和绑定到
模型在每个复选框上添加一个onclick脚本来执行form.submit?但我必须从controller更改数据库行值。那我该怎么处理呢?把点击的id放到一个隐藏的字段中。或者你可以使用ajax将文章的相关部分提交给一个新的控制器方法,或者……显示你尝试过的代码,包括你的控制器方法和视图。如果使用
EditorTemplate
或for
循环正确生成视图,则所有这些都将立即处理。您好Stephen Muecke!请不要介意。我可以用视图更新post,但我不确定如何从控制器处理回post。仍在努力这样做。如果可能的话,我们期待一个样品。谢谢你的解决方案。但它并没有更新。我需要包括任何其他特定的脚本才能使其工作吗?我已经做了与您提供的相同的操作。您是否包含了jquery-{version}.js
?如果浏览器控制台中出现任何错误怎么办。你正在使用控制器方法。您需要提供更多详细信息。没有错误,我已经包含了jQuery文件,版本为-1.10.2。但它不会更新数据库。它是否会影响控制器方法?(我刚刚注意到一个输入错误-应该是db.Entry(product.State=EntityState.Modified;
再次感谢。我之前注意到了这个错误,并根据我的更改了它。)。
public bool IsPublicPost { get; set; }
public string PublicPostDisplayText
{
get { return IsPublicPost ? "Yes" : "No"; }
}
for(int i = 0; i < Model.Items.Count; i++)
{
<tr>
<td>@Html.DisplayFor(m => m.Items[i].Id)</td> // see notes below
....
<td>@Html.CheckBoxFor(m => m.Items[i].IsPublicPost, new { @class = "post-checkbox", data_id = Model.Items[i].Id })</td>
// If you really want the extra column
<td class="post-text">@Html.DisplayFor(m => m.Items[i].PublicPostDisplayText)</td>
</tr>
}
var url = '@Url.Action("UpdatePublicPostStatus", "Home")';
$('.post-checkbox').click(function() {
var isChecked = $(this).is(':checked');
var id = $(this).data('id');
var row = $(this).closest('tr'); // only if you display the extra column
$.post(url, { id: id, isPublicPost: isChecked }, function(response) {
if (response) {
// no need to do anything, but if you display the extra column
var displayText = isChecked ? 'Yes' : 'No';
row.find('.post-text').text(displayText);
} else {
// Oops something went wrong - reset the checkbox and display error?
}
}).fail(function() {
// Oops something went wrong - reset the checkbox and display error?
});
});
[HttpPost]
public JsonResult UpdatePublicPostStatus(int id, bool isPublicPost)
{
MainDbContext db = new MainDbContext();
var product = db.Product.Find(id);
if (product != null) // always check
{
product.IsPublicPost = isPublicPost;
db.Entry(product).State = EntityState.Modified;
db.SaveChanges();
return Json(true);
}
// If something went wrong, e.g. an exception, then return Json(null);
}