2016-07-02 4 views
0
на клиентской

я следующий простой код ASPX:ViewState не сохраняет изменения

WebForm1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication3.WebForm1" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script type="text/javascript"> 
     function myFunction() { 
      document.getElementById("Label1").className = "clientAssignedClass"; 
     } 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <div> 
      <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
      <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 
       <ContentTemplate> 
        <asp:Label runat="server" Text="Label" ID="Label1"></asp:Label> 
        <asp:Button ID="Button1" runat="server" Text="Update" /> 
        <asp:Button ID="Button2" runat="server" Text="Change at server" OnClick="Button2_Click" /> 
       </ContentTemplate> 
      </asp:UpdatePanel> 
      <asp:UpdatePanel ID="UpdatePanel2" runat="server"> 
       <ContentTemplate> 
        <asp:Button ID="Button3" runat="server" Text="Change at client" OnClientClick="myFunction()" /> 
       </ContentTemplate> 
      </asp:UpdatePanel> 

     </div> 
    </form> 
</body> 
</html> 

со следующим кодом CS:

WebForm1.aspx.cs

using System; 

namespace WebApplication3 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void Button2_Click(object sender, EventArgs e) 
     { 
      Label1.CssClass = "serverAssignedClass"; 
     } 
    } 
} 

Когда я нажимаю кнопку Change at server (Button2), а затем кнопку Update, атрибут класса сохраняется через обратные вызовы, но когда я нажимаю Change at client (Button3), а затем Update, атрибут класса не сохраняется во всех обратных передачах (после Update postback любые изменения, сделанные на клиенте, будут потеряны).

Как сохранить изменения, сделанные на клиенте (например, изменение класса, сделанное Bootstrap, т. Е. active) через обратную передачу?

ответ

1

Ну, я полагаю, он делает то, для чего предназначен. Состояние просмотра на странице выливается в скрытое поле с именем __VIEWSTATE. Поскольку он на стороне сервера, он не может принимать изменения на стороне клиента. Это механизм для переноса назад и назад информации, имеющейся у вас на сервере. Для более подробного ознакомления смотрите статью this.

Ваш лучший выбор для набора css-класса на стороне клиента - это поместить его в какое-то поле, например hidden field, чтобы оно было отправлено обратно на сервер.

0

ViewState используется для хранения состояния страницы и ее элементов управления как установлено на сервере, чтобы состояние сохранялось между обратными передачами. Он не «знает» об изменениях, внесенных на страницу на клиенте.

ASP.NET webforms хочет управлять состоянием вашей страницы своим путем - все делается на сервере, а изменения состояния страницы хранятся в ViewState.

Если вы привыкли к более клиентскому коду, как это стало намного чаще, то работа с веб-формами может быть немного разочаровывающей по таким причинам. Вы пытаетесь сохранить состояние своей страницы на клиенте, но на странице содержатся элементы управления сервером, которые отправляются обратно на сервер. Затем сервер повторно отображает страницу, разрушая это клиентское состояние, потому что он знает только о состоянии, которое он поддерживает.

Если возможно, ваша жизнь будет проще, если вы не попытаетесь смешать с двумя. Если вы застряли в работе над существующим проектом webforms, попробуйте сделать все на сервере. Если вы создаете новый контент и хотите управлять состоянием на клиенте, не используйте серверные элементы управления. Просто используйте ASP.NET как средство для рендеринга исходного представления.

Если вы действительно хотите это сделать, вы можете хранить значения в куки или локальном хранилище, а при загрузке на странице проверить эти значения, чтобы увидеть, нужно ли восстанавливать некоторый класс CSS при загрузке страницы. Вы могли бы даже сделать что-то действительно странное, как поместить детали в скрытый ввод, а затем на стороне сервера отразить это так, чтобы при перезагрузке страницы клиентский скрипт знал, какое состояние (re) установить.

+0

Я не знаю, изучаете ли вы, или вы опытный разработчик, который застрял в работе над существующим проектом веб-форм. Если вы первый, моя рекомендация заключалась бы в том, чтобы удалить веб-формы и изучить MVC. Вебформы умирают.Это не бесполезно знать, потому что существует так много устаревшего кода, но я не вижу разработки новых приложений с веб-формами. MVC предназначен для бездействия, поэтому вам не придется иметь дело с сервером, который пытается управлять состоянием вашего представления между запросами. –

+0

Я закончил использование 'WebMethods', которые вызывается с jQuery для обновления сервера с состоянием элементов управления, которое затем сохраняется в веб-сеансе. И когда страница/страница страницы перезагружается, состояние восстанавливается из веб-сессии. Я только начинаю с ASP, и я смотрел как MVC, так и Webforms, и кажется, что Webforms более прямолинейны в использовании. Проект, который я делаю, представляет собой тяжелую серверную часть с простым веб-интерфейсом, но с динамически создаваемыми элементами управления начальной загрузкой. – Chris

Смежные вопросы