ASP.NET设置和获取属性中的视图状态

时间:2017-03-01 10:23:58

标签: asp.net

有人可以向我解释下面写的代码

 public IList<GetProductPrice> CurrentPage
    {
        get { return ViewState["CurrentPage"] as List<GetProductPrice>; }
        set { ViewState["CurrentPage"] = value; }
    }

3 个答案:

答案 0 :(得分:0)

此属性允许属性的使用者像Local集合一样使用它而不在代码中引用ViewState。它将使代码简单易用。

get { return ViewState["CurrentPage"] as List<GetProductPrice>; }

这里ViewState对象ViewState [“CurrentPage”]被转换为GetProductPrice列表

set { ViewState["CurrentPage"] = value; }

此处列表被分配给ViewState [“CurrentPage”]

答案 1 :(得分:0)

它被称为财产。它们在编译时生成getter和setter函数:

List<GetProductPrice> GetCurrentPage(){ 
    return ViewState["CurrentPage"] as List<GetProductPrice>; 
}
void SetCurrentPage(List<GetProductPrice> value) { 
     ViewState["CurrentPage"] = value; 
}
//i think its actual get_.. but it doesn't matter for the example 

因此它产生了易用性的getter setter。您可以使用以下方式致电:

 var test = CurrentPage; //compiled to var test = GetCurrenctPage();
 CurrentPage = test; //compiled to SetCurrentPage(test);

如果你把getter和setter留空,就像这样:

public int CurrentPage
{
    get;
    set;
}

它还会在存储数据的类上生成一个支持字段:

private int _currentPage;
public GetCurrentPage(){ return _currentPage }
public SetCurrentPage(int value) { _currentPage = value }

为什么我们这样做?

使用getter和setter是java中一个非常古老的最佳实践(其中ide可以选择生成它们)。但这会产生很多样板代码!

在C#中,他们试图通过添加这些属性来解决这个问题。但为什么我们需要吸气剂和制定者呢?例如,如果您希望在值更改时收到通知(将类自身标记为脏)。我认为实体框架使用它来跟踪模型是否被更改,否则它不会进行数据库更新调用。还有其他有用的工具在编译时在属性中注入代码。添加额外的功能。

如何不使用它:

使用属性返回HttpContext.Current是危险的,因为你暗中依赖HttpContext所以尽量不要这样做!

一般来说,当get或set中的代码非常繁重(非常苛刻)时,使用它也是不好的做法。这是一种不好的做法,因为使用代码的其他人可能会认为他只是设置属性/字段,而实际执行了一些非常繁重的代码。它的最佳实践是为此创建一个特殊的函数,而将getter / setter私有化:

 public int Property {get; private set; }
 public SetProperty(int value){
     //intensive code here:
     Property = value;
 }

答案 2 :(得分:0)

此代码仅适用于控制器,其中ViewState是属性。此CurrentPage属性提供了一种静态类型的方式,可通过该属性访问某个ViewState项。

因此,您可以只使用ViewState["CurrentPage"] as List<GetProductPrice>属性,而不是在您想要访问“当前页面”的控制器代码上遍布CurrentPage

当然“当前页面”是由开发人员选择命名此类内容而构成的术语,我看不出List<GetProductPrice>与“当前页面”的关系如何。