开发者

Check for a value in ViewState

Hey all, i am new at the ViewState and i am looking to see what values are stored within it. I know how to loop through an array to check for a value but i do not know how to go about doing that for a ViewState("test") property.

Let's say i have added "bob, tom, Jim" to a ViewState called ViewState("test"). I would like to be able to see if "tom" was in the ViewState("test"). If not then add it but if it exists already then skip it.

Thanks!

David

THE CODE

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 N开发者_开发知识库ot ViewState("strIDArray").ToString().Contains(strID) Then
                strIDArray(idIndexNumber + 1) = strID
                ViewState("strIDArray") = CLng(ViewState("strIDArray").ToString()) And CLng(strID)
            End If
End Sub

I'm so confused.. ha.


Assuming you put the values in as a single string:

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

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

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

End If

The above would work if you're using a single string to store the names. You may want to consider a collection object such as List.

You could then have:

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

On a side note, I hate VB.NET. You should consider C#. So much simpler to follow:

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");
}


You can check known keys of ViewState by just interrogating the key; the following will not throw an exception if "test" hasn't been set in ViewState:

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

ViewState, being a StateBag, is also an IEnumerable, meaning you can iterate through its contents using foreach, or use Linq to search by value:

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

Lastly, ViewState exposes collections of its Keys and Values as ICollections. These can also be iterated as an ICollection is an IEnumerable, meaning you can use Linq to check for the existence of a key:

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


Typically, you would first test that the ViewState item exists.

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

If it does, the next step is to retrieve the object stored with the specified key. Since it is stored as an object, we would need to cast to what the type really is in our code.

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

At which point, performing our test of a particular value's existence inside our list to be a matter of normal code.

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

In VB, that would probably be something like

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


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜