Так что в моем приложении Asp.net у меня есть этот элемент управления представлением дерева. пример Этот элемент управления поддерживает событие «перетаскивания», а при событии «drop» срабатывает функция Javascript, вызывающая функцию на стороне сервера, которая обновляет дерево.
Здеськод:
Js
function ob_OnNodeDrop(src, dst, copy)
{
if(ob_ev("OnNodeDrop"))
{
if(typeof ob_post == "object")
{
ob_post.AddParam("src", src);
ob_post.AddParam("dst", dst);
ob_post.post(reqpage, "OnNodeDrop");
}
else
{
alert("Please add obout_AJAXPage control to your page to use the server-side events");
}
}
}
C#
public string OnNodeDrop(string src, string dst)
{
oTreeDB.EventType = TreeDB.EventTypes.UpdateLevel;
oTreeDB.Fields[TreeDB.StandardFields.ID].Value = src;
oTreeDB.Fields[TreeDB.StandardFields.ParentID].Value = dst;
string sResult = oTreeDB.ExecuteEvent();
}
Тем не менее, этот ob_post.post(reqpage, "OnNodeDrop")
, кажется, очищает viewstate
страницы, что делает проверку приложения Anti-XSRF
неудачной.
Вот часть моегоAnti-XSRF
проверка кода:
if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue)
{
throw new InvalidOperationException() //the ViewState cannot be null;
}
Я не хочу проверять, как работает antiXsrf, поэтому мне нужно либо:
1: сделать ob_post.post
не очищать viewstate
2: используйте __doPostBack
вместо.
Я не знаю, как справиться с методом 1. Проблема с методом 2 заключается в том, что ob_post.post
только частично обновляет представление и может напрямую вызывать метод в коде.позади.Но __doPostBack
обычно вызывает полное обновление страницы и не может напрямую вызывать открытый метод в коде.Кроме того, когда я использую __doPostBack
, перетаскиваемый узел в другое место будет возвращаться к исходному месту после postback
, даже если состояние изменилось в базе данных.