2010-09-17 3 views
1

Привет всем, я новичок в ViewState, и я смотрю, какие значения хранятся в нем. Я знаю, как перебирать массив для проверки значения, но я не знаю, как это сделать для свойства ViewState («test»).Проверить значение в ViewState

Предположим, я добавил «bob, tom, Jim» в ViewState под названием ViewState («test»). Я хотел бы узнать, был ли «tom» в ViewState («test»). Если нет, добавьте его, но если он уже существует, пропустите его.

Спасибо!

Дэвид

КОД

Public strIDArray() As String 
Public vsSaver As String 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     If Not Page.IsPostBack Then 
      ViewState("vsSaver") = "0000770000" 
     Else 
      If (Not ViewState("vsSaver") Is Nothing) Then 
       strIDArray(strIDArray.Length) = CType(ViewState("vsSaver"), String) 
      End If 
     End If 
end sub 

Private Sub gvData_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvData.RowCommand 
     Dim idIndexNumber As Integer = Array.IndexOf(strIDArray, strID) 

      If Not ViewState("strIDArray").ToString().Contains(strID) Then 
       strIDArray(idIndexNumber + 1) = strID 
       ViewState("strIDArray") = CLng(ViewState("strIDArray").ToString()) And CLng(strID) 
      End If 
End Sub 

Я так растерялся .. ха.

+0

Можете ли вы разместить код? Как вы добавили имена? Как массив строк? Одна строка? Мы не можем действительно ответить на этот вопрос, не зная. –

+0

Я добавил код выше, KP. – StealthRT

ответ

8

Предполагая, что вы кладете значения в виде одной строки:

ViewState("test") = "bob, tom, jack" 

If Not ViewState("test").ToString().Contains("tom") Then 

    ViewState("test") = ViewState("test").ToString() And ", tom" 

End If 

выше будет работать, если вы используете одну строку, чтобы сохранить имена. Возможно, вы захотите рассмотреть объект коллекции, такой как List.

Вы могли бы иметь:

Dim names As New List(Of String)() From { _ 
    "tom", _ 
    "jack", _ 
    "harry" _ 
} 

ViewState("test") = names 

Dim viewstateNames As List(Of String) = TryCast(ViewState("test"), List(Of String)) 

If viewstateNames IsNot Nothing AndAlso Not viewstateNames.Contains("tom") Then 
    viewstateNames.Add("tom") 
End If 

На стороне записки, я ненавижу VB.NET. Вы должны рассмотреть C#. Настолько проще:

List<string> names = new List<string> { "tom", "jack", "harry" }; 
ViewState["test"] = names; 

List<string> viewstateNames = ViewState["test"] as List<string>; 
if (viewstateNames != null && !viewstateNames.Contains("tom")) 
{ 
    viewstateNames.Add("tom"); 
} 
+0

Я добавил свой код в свой OP выше но я немного запутался в том, как сохранить его (и где) и как его получить в виде цикла. – StealthRT

0
Dim testValue As String = CStr(ViewState("test")) 

If testValue.IndexOf("tom") = -1 Then 
'add it.... 
testValue += testValue & ", tom" 'will add to end of string 
ViewState("test") = testValue 
End If 
+0

Я добавил свой код в свой OP выше, но я немного смущен тем, как его сохранить (и где) и как его получить в виде цикла. – StealthRT

2

Обычно вы должны проверить, что элемент ViewState существует.

if (ViewState["Foo"] != null) 
{ 
    // maybe I can do something here 
} 

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

if (ViewState["Foo"] != null) 
{ 
    List<string> values = (List<string>)ViewState["Foo"]; 
    // do something with values 
} 

В этот момент, выполняя наш тест существования определенного значения внутри нашего списка, является нормальным кодом.

if (ViewState["Foo"] != null) 
{ 
    List<string> values = (List<string>)ViewState["Foo"]; 
    if (!values.Contains("tom")) 
    { 
     values.Add("tom"); 
    } 
} 

В VB, что, вероятно, будет что-то вроде

If Not (ViewState("Foo") Is Nothing) Then 
    List(of String) values = CType(ViewState("Foo"), List(of String)) 
    If Not (values.Contains("tom")) Then 
     values.Add("tom") 
    End If 
End If 
+0

Я добавил свой код в свой OP выше, но я немного смущен тем, как его сохранить (и где) и как получить его в виде цикла. – StealthRT

3

Вы можете проверить известны ключи ViewState, просто опрашивая ключ; следующий не будет бросать исключение, если «тест» не был установлен в ViewState:

if(ViewState["test"] == null) ... 

ViewState, будучи StateBag, также IEnumerable, то есть вы можете перебирать его содержимое с помощью Еогеасп, или использовать Linq искать по значению:

ViewState.Where(si=>si.IsDirty); //gets all ViewState members that changed since the last postback 

Наконец, ViewState выставляет коллекции своих ключей и значений, как ICollections.Они также могут быть итерированы, поскольку ICollection - это IEnumerable, то есть вы можете использовать Linq для проверки наличия ключа:

if(ViewState.Keys.Any(k=>k == "test")) ... 
+0

Я думаю, что OP интересовался проверкой значения в объекте viewstate с ключом 'test', а не только на том, что ключ/элемент существует. –