使用ASP.NET MVC和jQuery仅刷新更新的行
我不熟悉ASP.NETMVC和jQuery,并尝试做一些经典的事情。我的需要是提供CRUD功能和弹出式编辑表单 我已经创建了一个表并显示了数据。我有一个部分视图呈现每个表行,索引视图在循环中调用它:使用ASP.NET MVC和jQuery仅刷新更新的行,jquery,html,asp.net-mvc-3,jquery-ui,jquery-plugins,Jquery,Html,Asp.net Mvc 3,Jquery Ui,Jquery Plugins,我不熟悉ASP.NETMVC和jQuery,并尝试做一些经典的事情。我的需要是提供CRUD功能和弹出式编辑表单 我已经创建了一个表并显示了数据。我有一个部分视图呈现每个表行,索引视图在循环中调用它: <tbody> @foreach (var item in Model) { @Html.Partial("_OrderRow", item) } </tbody> 因此,在客户端的updateSuccess函数中,我有更新项目的HTML 之后,我只需使用jQuer
<tbody>
@foreach (var item in Model)
{
@Html.Partial("_OrderRow", item)
}
</tbody>
因此,在客户端的updateSuccess函数中,我有更新项目的HTML
之后,我只需使用jQuery获取相应的表行,然后使用replaceWith将其替换为最新的表行
到目前为止,这个场景运行良好。但我的问题是,它不会改变实际的HTML,它只会操纵DOM。因此,如果我在尝试刷新表(样式、分页等)时使用一些表插件(如DataTables、TableSorter等),它们会忽略我的新表行。因为实际的HTML包含旧的HTML
当我插入新行或删除时,似乎也会遇到同样的问题
我更喜欢这种方式,因为它不依赖于任何插件(尽可能),并控制我的视图。因此,我们非常感谢您的帮助
谢谢。DOM是浏览器对内存中HTML的解释。表插件也必须在DOM上运行。你看到插件失败了吗?如果您对某个特定插件有疑问,这可能有助于引导讨论。为什么不替换整个表而不是一行?你有什么理由不能那样做吗?我会把整个表放在它自己的局部视图中……除非有特定的原因,否则你不会这样做。@Mike:例如,jQuery DataTables插件,当我像前面所说的那样刷新更新的字段时,它会失去样式等等,因为它是一个新的。所以我调用fnDraw()函数来刷新表。我希望它能改变整个桌子的样式,包括我的新桌子。但它会呈现旧的HTML(使用旧值),因为实际的HTML(当我查看页面源代码时)不会更改。创建一个带有一些s的表。2.使用jQueryDataTables插件(而不是服务器端)3设计它。使用jQuery的replaceWith函数将其中一个替换为新的(更改其中的一些值)。你会看到它失去了它的风格,排序等。调用其fnDraw()函数刷新这些。你会看到旧的值又回来了。噢,我明白问题所在了,至少在数据表方面是这样。该插件有自己的用于添加行的API(
fnAddData
)。fnDraw()
删除该行的原因是插件保留自己的DOM内部副本,并在调用该方法时呈现该副本。看起来有些函数可以获取外部数据(fnAddTr
)。我希望其他表插件也有类似的API,如果您要添加自己的行,您需要调用这些API。DOM是浏览器对内存中HTML的解释。表插件也必须在DOM上运行。你看到插件失败了吗?如果您对某个特定插件有疑问,这可能有助于引导讨论。为什么不替换整个表而不是一行?你有什么理由不能那样做吗?我会把整个表放在它自己的局部视图中……除非有特定的原因,否则你不会这样做。@Mike:例如,jQuery DataTables插件,当我像前面所说的那样刷新更新的字段时,它会失去样式等等,因为它是一个新的。所以我调用fnDraw()函数来刷新表。我希望它能改变整个桌子的样式,包括我的新桌子。但它会呈现旧的HTML(使用旧值),因为实际的HTML(当我查看页面源代码时)不会更改。创建一个带有一些s的表。2.使用jQueryDataTables插件(而不是服务器端)3设计它。使用jQuery的replaceWith函数将其中一个替换为新的(更改其中的一些值)。你会看到它失去了它的风格,排序等。调用其fnDraw()函数刷新这些。你会看到旧的值又回来了。噢,我明白问题所在了,至少在数据表方面是这样。该插件有自己的用于添加行的API(fnAddData
)。fnDraw()
删除该行的原因是插件保留自己的DOM内部副本,并在调用该方法时呈现该副本。看起来有些函数可以获取外部数据(fnAddTr
)。我希望其他表插件也有类似的API,如果您要添加自己的行,则需要调用这些API。
[HttpPost]
public JsonResult OrderEdit(OrderViewModel order)
{
if (ModelState.IsValid)
{
Order ord = OrderMapper.MapToEntity(order);
db.Orders.Attach(ord);
db.ObjectStateManager.ChangeObjectState(ord, EntityState.Modified);
db.SaveChanges();
return Json(new { Success = true, ObjectId = order.Id, Html = RenderPartialViewToString("_OrderRow", order) }, JsonRequestBehavior.DenyGet);
}
return Json(new { Success = false, Object = order }, JsonRequestBehavior.DenyGet);
}