静态与公共财产

问题描述:

我在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

每当你写一个函数或声明一个变量,它不会在内存中创建实例,直到你创建了类的对象。但是,如果使用静态修饰符声明任何函数或变量,它会直接在内存中创建实例并在全局范围内执行操作。静态修饰符不会引用任何对象。 所以它们就像内存中的单个副本,被所有人共享。 您应该仅为应用程序的硬编码值使用静态变量。 请参阅此处以获得更多说明 What is the use of static variable in C#? When to use it? Why can't I declare the static variable inside method?

变量的静态限定符表示变量定义一次。如果没有静态限定符,则每次创建类的实例时都会定义该变量。 例如:

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 

问题应该是静态与实例属性。功能是两者之间的基本区别。静态属性在类的所有对象之间共享。所以,无论何时发出新的请求,都会创建一个新的控制器类实例。由于该属性是静态的,因此可用于控制器的新实例来获取和设置它。但是,在实例变量的情况下,该属性也是新建的,并且在创建控制器的新实例时进行初始化。