2014-09-03 143 views
1

我在MVC中編寫代碼,我不明白我項目中的行爲公共屬性!我的代碼非常簡單,增量屬性。當我按下按鈕時,屬性被覆蓋。它的工作只有當我有STATIC屬性,但是當我有PUBLIC時,增量不起作用。公共資產是短暫的?你能幫我明白這一點, 其我的控制器:靜態與公共財產

public class DatsController : Controller 
{ 
    // GET: Dats 
    Dats dats; 
    static public int _Var 
    { 
     get; set; 
    } 
    public DatsController() 
    {   
      dats = new Dats();  
    } 

    public ActionResult Index() 
    { 
     if (Request.HttpMethod == "post") 
     { 
      ViewBag.zmienna = _Var; 
      dats.dayToday = DateTime.Now.Date; 

     } 
     else 
     { 
      // var = var + 5; 
      ViewBag.zmienna = _Var; 
     } 

     return View(); 
    } 

    public ActionResult Next() 
    { 
     _Var = _Var + 5; 
     //dats.firstDayWeek = data.firstDayWeek.AddDays(7); 
     return RedirectToAction("Index", "Dats"); 
    } 
} 

你的答案確定THX!我讀過了,我寫了另一個代碼,仍然沒有工作....我知道問題在哪裏,但我不知道如何解決它們; /如果你能幫助我,我會很好:)

我的模型:

public class Dats 
{ 
    static private DateTime _dataToday; 
    static private DateTime _firstDayWeek; 
    static private DateTime _lastDayWeek; 

    static public DateTime DayToday { get { return _dataToday = DateTime.Now.Date; } } 
    static public DateTime FirstDayWeek { get { return _firstDayWeek = Dats.pierwszyDzienTygodnia(_dataToday); } set { _firstDayWeek = value; } } 
    static public DateTime LastDayWeek { get { return _lastDayWeek = Dats.ostatniDzienTygodnia(_dataToday); } set { _lastDayWeek = value; } } 

    static public DateTime pierwszyDzienTygodnia(DateTime data) 
    { 

     int dzien = DayOfWeek.Monday - data.DayOfWeek; 
     if (dzien > 0) 
     { 
      dzien -= 7; 
     } 
     return data.Date.AddDays(dzien); 
    } 
    static public DateTime ostatniDzienTygodnia(DateTime data) 
    { 
     DateTime ostatniDzien = pierwszyDzienTygodnia(data.Date); 
     return ostatniDzien.Date.AddDays(6); 

    } 

} 

我的控制器:

public class DatsController : Controller 
{ 

    public ActionResult Index() 
    { 

     return View(); 
    } 

    public ActionResult Next() 
    { 
     Dats.FirstDayWeek = Dats.FirstDayWeek.AddDays(7); 
     return RedirectToAction("Index", "Dats"); 
    } 
} 

我的觀點:

@using (Html.BeginForm("Next", "Dats", FormMethod.Post)) 
{ 
    <button type="submit">Next</button> 
    @*@Html.ActionLink("dalej","Next", "Visits",new {data =7})*@ 

    <dl class="dl-horizontal"> 
     @Dats.DayToday 
     <dd>@Dats.FirstDayWeek</dd> 
     <dd>@Dats.LastDayWeek</dd> 
    </dl> 
} 

,我想來增大日期在我的財產第一天DayWeek。

+0

不要像*不要*那樣在控制器中使用靜態屬性。控制器不是*線程安全的,因此不僅要在特定用戶的多個請求之間共享靜態屬性,還要共享所有用戶的所有請求。換句話說,你在不同的客戶端之間泄露數據。 – 2014-09-03 14:09:22

回答

0

每當你寫一個函數或聲明一個變量,它不會在內存中創建實例,直到你創建了類的對象。但是,如果使用靜態修飾符聲明任何函數或變量,它會直接在內存中創建實例並在全局範圍內執行操作。靜態修飾符不會引用任何對象。 所以它們就像內存中的單個副本,被所有人共享。 您應該僅爲應用程序的硬編碼值使用靜態變量。 請參閱此處以獲得更多說明 What is the use of static variable in C#? When to use it? Why can't I declare the static variable inside method?

0

變量的靜態限定符表示變量定義一次。如果沒有靜態限定符,則每次創建類的實例時都會定義該變量。 例如:

class A{ 
    public static int c; 
}; 
class B{ 
    public int c; 
} 

A a = new A(); 
a.c =0; 
a.c++;//1 
A aa = new A(); 
aa.c++;//2 

B b= new B(); 
b.c++;//1; 
B bb = new B(); 
bb.c++;//1 
0

問題應該是靜態與實例屬性。功能是兩者之間的基本區別。靜態屬性在類的所有對象之間共享。所以,無論何時發出新的請求,都會創建一個新的控制器類實例。由於該屬性是靜態的,因此可用於控制器的新實例來獲取和設置它。但是,在實例變量的情況下,該屬性也是新建的,並且在創建控制器的新實例時進行初始化。