在ASP.NET中保留枚举值

3
我有一个asp.net页面,在其中使用枚举(在app_code中定义属性的类文件中)。
现在我的问题是每当页面进行postbacks时,属性中枚举的值都会重置为第一个。
我甚至试图将属性设置为静态的,但仍然没有帮助。以下是我的枚举和属性声明:
private static UrlType _type;
public static UrlType UrlPattern
{
    get
    {
        HttpContext.Current.Response.Write("GET: " +_type + "<br>");
        return _type;
    }
    set
    {
        _type = value;
        HttpContext.Current.Response.Write("SET : " +_type + "<br>");
    }
}
public int VanityId { get; set; }
public enum UrlType
{
    ArticleOnly,
    ArticleCategoryCombination,
    Normal,
    TechForum
}

这是我的调用方式:

public void BindRewrite()
{
    GrdRewrite.DataSource = objVanity.GetAllRewriteVanities(Vanity.UrlPattern);
    GrdRewrite.DataBind();
    if (Vanity.UrlPattern == Vanity.UrlType.ArticleCategoryCombination)
    {
        GrdRewrite.Columns[2].Visible = false;
        GrdRewrite.Columns[3].Visible = GrdRewrite.Columns[5].Visible = GrdRewrite.Columns[6].Visible = true;
    }
    else if (Vanity.UrlPattern == Vanity.UrlType.ArticleOnly)
    {
        GrdRewrite.Columns[5].Visible = true;
        GrdRewrite.Columns[2].Visible = GrdRewrite.Columns[3].Visible = GrdRewrite.Columns[6].Visible = false;
    }
    else if (Vanity.UrlPattern == Vanity.UrlType.Normal)
    {
        GrdRewrite.Columns[2].Visible = true;
        GrdRewrite.Columns[3].Visible = GrdRewrite.Columns[5].Visible = GrdRewrite.Columns[6].Visible = false;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    pnlAdmin.Visible = (objVanity.UserName == "host");

    if (objVanity.UserName == "host")
        Enable();
    else
        FieldsOpenForEditors(objVanity.SiteSupportUrlFormat);

    if (!IsPostBack)
    {
        Vanity.GenerateListFromEnums(drpAdminUrlType);
        if (objVanity.UserName == "host")
            Vanity.UrlPattern = Vanity.UrlType.ArticleOnly;
        else
            Vanity.UrlPattern = objVanity.SiteSupportUrlFormat;

        BindRewrite();
    }
}

请问有谁知道如何在postback中保留枚举的值?

我认为ViewState可能是一个选择,但不知道如何存储枚举值并恢复枚举转换后的字符串值。

1个回答

8

如果您想在提交后保留值,则需要将其存储在Session、Cache或ViewState中。

在您的情况下,ViewState可能是首选。

public UrlType UrlPattern
{
    get
    {
        if (ViewState["UrlPattern"] != null)
            return (UrlType)Enum.Parse(typeof(UrlType), ViewState["UrlPattern"].ToString());
        return UrlType.Normal; // Default value
    }
    set
    {
        ViewState["UrlPattern"] = value;
    }
}

我遇到了一个问题,问题出在我的GridView上,每当用户点击更新时,我必须更新我的Web.config文件以使UrlRewrite更改生效,因此每当我更新Web.config文件时,我的会话就被清除并且枚举值会恢复为其默认值,有没有一种方法可以保留它。 - Abbas
如果你触碰了web.config文件,那么你的应用程序将会重新启动。存储数据的唯一方式是通过文件或数据库。 - Win
.NET也可以配置为将会话状态存储在数据库中。 - Mike Christensen
@Abbas 正如 Mike 所述,您可以首先将数据存储在 SessionState 中。然后配置您的应用程序将 SessionState 存储在 StateServer 或 SQLServer 中。 - Win

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接