ViewBag, ViewData и TempData



может ли тело объяснить, когда использовать




  1. TempData

  2. ViewBag

  3. ViewData


У меня есть требование, где мне нужно установить значение в контроллере один, что контроллер перенаправит на контроллер два и контроллер два будет отображать представление.



Я попытался использовать ViewBag, значение теряется к тому времени, когда я достигаю контроллера два.



могу ли я знать, когда использовать и преимущества или недостатки?



спасибо

623   8  

8 ответов:

1) TempData

позволяет хранить данные, которые сохранятся для перенаправления. Внутренне он использует сеанс как магазин выпечки, просто после перенаправления данные автоматически выселяются. Картина следующая:

public ActionResult Foo()
{
    // store something into the tempdata that will be available during a single redirect
    TempData["foo"] = "bar";

    // you should always redirect if you store something into TempData to
    // a controller action that will consume this data
    return RedirectToAction("bar");
}

public ActionResult Bar()
{
    var foo = TempData["foo"];
    ...
}

2)ViewBag, ViewData

позволяет хранить данные в действии контроллера, которое будет использоваться в соответствующем представлении. Это предполагает, что действие возвращает вид и не перенаправляет. Живет только во время текущего запроса.

картина следующая:

public ActionResult Foo()
{
    ViewBag.Foo = "bar";
    return View();
}

и в вид:

@ViewBag.Foo

или с ViewData:

public ActionResult Foo()
{
    ViewData["Foo"] = "bar";
    return View();
}

и в вид:

@ViewData["Foo"]

ViewBag это просто динамическая обертка вокруг ViewData и существует только в ASP.NET MVC 3.

как говорится, ни одна из этих двух конструкций никогда не должна использоваться. Вы должны использовать модели просмотра и сильно типизированные представления. Таким образом, правильный шаблон выглядит следующим образом:

Модель Вид:

public class MyViewModel
{
    public string Foo { get; set; }
}

действие:

public Action Foo()
{
    var model = new MyViewModel { Foo = "bar" };
    return View(model);
}

строго типизированный вид:

@model MyViewModel
@Model.Foo

после этого краткого введения давайте ответим на ваш вопрос:

мое требование заключается в том, что я хочу установить значение в контроллере, что контроллер перенаправит на ControllerTwo и Controller2 будет отображаться вид.

public class OneController: Controller
{
    public ActionResult Index()
    {
        TempData["foo"] = "bar";
        return RedirectToAction("index", "two");
    }
}

public class TwoController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Foo = TempData["foo"] as string
        };
        return View(model);
    }
}

и соответствующий вид (~/Views/Two/Index.cshtml):

@model MyViewModel
@Html.DisplayFor(x => x.Foo)

есть и недостатки использования TempData: если пользователь нажмет F5 на целевой странице, данные будут потеряны.

лично я тоже не использую TempData. Это потому, что внутренне он использует сеанс, и я отключаю сеанс в своих приложениях. Я предпочитаю более спокойный способ достичь этого. То есть: в первом действии контроллера, которое выполняет перенаправление, сохраните объект в вашем хранилище данных и сгенерированный пользователем уникальный идентификатор при перенаправлении. Затем в целевом действии используйте этот идентификатор для возврата первоначально сохраненного объекта:

public class OneController: Controller
{
    public ActionResult Index()
    {
        var id = Repository.SaveData("foo");
        return RedirectToAction("index", "two", new { id = id });
    }
}

public class TwoController: Controller
{
    public ActionResult Index(string id)
    {
        var model = new MyViewModel
        {
            Foo = Repository.GetData(id)
        };
        return View(model);
    }
}

вид остается прежним.

ASP.NET MVC предлагает нам три варианта ViewData, ViewBag и TempData для передачи данных от контроллера к просмотру и в следующем запросе. ViewData и ViewBag почти похожи, и TempData выполняет дополнительную ответственность. Давайте обсудим или получим ключевые моменты по этим трем объектам:

сходства между ViewBag и ViewData:

  • помогает поддерживать данные при переходе от контроллера к просмотру.
  • используется для передачи данных из контроллер к соответствующему виду.
  • короткая жизнь означает, что значение становится нулевым, когда происходит перенаправление. Это потому что их цель состоит в том, чтобы обеспечить способ общения между контроллеры и виды. Это механизм связи внутри вызов сервера.

разница между ViewBag и ViewData:

  • ViewData-это словарь объектов, производных от Класс и экземпляр класса viewdatadictionary можно с помощью строки как ключи.
  • ViewBag-это динамическое свойство, которое использует новый динамический функции в C# 4.0.
  • ViewData требует типизации для сложного типа данных и проверки нулевые значения, чтобы избежать ошибки.
  • ViewBag не требует типизации для сложных типов данных.

ViewBag & ViewData Пример:

public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}


public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

В Виде:

@ViewBag.Name 
@ViewData["Name"] 

TempData:

TempData также a словарь, полученный из класса TempDataDictionary и сохраненный в сеансе short lives, является строковым ключом и значением объекта. Разница в том, что жизненный цикл объекта. TempData сохраняет информацию на время HTTP-запроса. Это означает только от одной страницы к другой. Это также работает с перенаправлением 302/303, потому что оно находится в том же HTTP-запросе. Помогает поддерживать данные при переходе от одного контроллера к другому контроллеру или от одного действия к другому действию. Другими словами, когда вы перенаправление, "TempData" помогает поддерживать данные между этими перенаправлениями. Он внутренне использует переменные сеанса. Использование временных данных во время текущего и последующего запроса означает, что они используются только тогда, когда вы уверены, что следующий запрос будет перенаправлен на следующий вид. Это требует типизации для сложного типа данных и проверки нулевых значений, чтобы избежать ошибки. Обычно используется для хранения только однократных сообщений, таких как сообщения об ошибках, сообщения проверки.

public ActionResult Index()
{
  var model = new Review()
            {
                Body = "Start",
                Rating=5
            };
    TempData["ModelName"] = model;
    return RedirectToAction("About");
}

public ActionResult About()
{
    var model= TempData["ModelName"];
    return View(model);
}

последний механизм-это сеанс, который работа как ViewData, как словарь, который принимает строку для ключа и объект для значения. Этот файл хранится в файле Cookie клиента и может использоваться в течение гораздо более длительного времени. Он также нуждается в дополнительной проверке, чтобы никогда не иметь никакой конфиденциальной информации. Что касается ViewData или ViewBag, вы должны использовать его разумно для производительности приложений. Потому что каждое действие проходит через весь жизненный цикл регулярного asp.net запрос mvc. Вы можете использовать ViewData/ViewBag в своем детском действии, но будьте осторожны вы не используете его для заполнения несвязанных данных, которые могут загрязнить ваш контроллер.

TempData

в основном это похоже на DataReader, после прочтения данные будут потеряны.

посмотреть это видео.

пример

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        String str = TempData["T"]; //Output - T
        return View();
    }
}

если вы обратите внимание на приведенный выше код, RedirectToAction не влияет на TempData, пока TempData не будет прочитан. Таким образом, после чтения TempData значения будут потеряны.

как я могу сохранить TempData после читаешь?

Проверьте выход в методе действия тест 1 и тест 2

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        string Str = Convert.ToString(TempData["T"]);
        TempData.Keep(); // Keep TempData
        return RedirectToAction("Test2");
    }

    public ActionResult Test2()
    {
        string Str = Convert.ToString(TempData["T"]); //OutPut - T
        return View();
    }
}

если вы обратите внимание на приведенный выше код, данные не теряются после RedirectToAction, а также после чтения данных и причина в том, что мы используем TempData.Keep(). это что

таким образом, вы можете сделать его сохраняться до тех пор, как вы хотите в других контроллерах также.

ViewBag/ViewData

данные будут сохраняться в соответствующий вид

TempData in Asp.Net MVC является одним из очень полезных функций. Он используется для передачи данных от текущего запроса к последующему запросу. Другими словами, если мы хотим отправлять данные с одной страницы на другую страницу во время перенаправления, мы можем использовать TempData, но нам нужно сделать некоторые соображения в коде для достижения этой функции в MVC. Потому что жизнь TempData очень коротка и лежит только до тех пор, пока целевое представление не будет полностью загружено. Но, мы можем использовать метод Keep() для сохранения данных в TempData.

Подробнее

ViewBag, ViewData, TempData и состояние просмотра в MVC

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

ASP.NET MVC предлагает нам три варианта ViewData, VieBag и TempData для передачи данных от контроллера к просмотру и в следующем запросе. ViewData и ViewBag почти похожи, и TempData выполняет дополнительную ответственность.

сходства между ViewBag и ViewData :

помогает поддерживать данные при переходе от контроллера к просмотру. Привыкший передайте данные от контроллера к соответствующему виду. Короткая жизнь значит значение становится null, когда происходит перенаправление. Это потому, что их цель это обеспечивает способ связи между контроллерами и представлениями. Это механизм связи внутри вызова сервера.

разница между ViewBag и ViewData:

ViewData-это словарь объектов, производных от ViewDataDictionary класс и доступны с помощью строк в качестве ключей. ViewBag это динамическое свойство, которое использует преимущества новых динамических функций в C# 4.0. ViewData требует типизации для сложных типов данных и проверьте наличие нулевых значений, чтобы избежать ошибки. ViewBag не требует типизация для сложных типов данных.

ViewBag & ViewData Пример:

public ActionResult Index()

{  
    ViewBag.Name = "Arun Prakash";
    return View();    
}

public ActionResult Index()  
{
    ViewData["Name"] = "Arun Prakash";
    return View(); 
}

в виду, мы называем как ниже:

@ViewBag.Name   
@ViewData["Name"]

TempData:

помогает поддерживать данные при переходе от одного контроллера к другому контроллер или от одного действия к другому действию. Другими словами, когда вы перенаправление, "Tempdata" помогает поддерживать данные между этими перенаправлениями. Он внутренне использует переменные сеанса. Данных tempdata-это значит быть очень недолговечный экземпляр, и вы должны использовать его только во время текущего и последующие запросы только

единственный сценарий, в котором использование TempData будет надежно работать, - это когда вы перенаправляете. Это связано с тем, что перенаправление убивает текущий запрос (и отправляет объект HTTP status code 302, перемещенный на клиент), а затем создает новый запрос на сервере для обслуживания перенаправленного представления.

он требует типизации для сложного типа данных и проверки нулевых значений, чтобы избежать ошибки.

public ActionResult Index()
{   
   var model = new Review()  
   {  
      Body = "Start",  
      Rating=5  
   };  

    TempData["ModelName"] = model;    
    return RedirectToAction("About");   
} 

public ActionResult About()       
{  
    var model= TempData["ModelName"];  
    return View(model);   
}  
void Keep()

Calling this method with in the current action ensures that all the items in TempData are not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep(); // retains all strings values
    } 

void Keep(string key)

Calling this method with in the current action ensures that specific item in TempData is not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep("emp"); // retains only "emp" string values
    } 

TempData всегда будет доступен до первого чтения, после чтения его не может быть полезно, чтобы передать краткое сообщение и посмотреть, что будет после первого чтения. ViewBag Его более полезно при быстрой передаче части данных в представление, обычно вы должны передать все данные в представление через модель , но есть случаи, когда вы моделируете поступление непосредственно из класса, который сопоставляется с базой данных, такой как Entity framework в этом случае вам не нужно менять модель, чтобы передать новую часть данных, вы можете вставить это в viewbag ViewData - это просто индексированная версия ViewBag и использовалась до MVC3

также объем различен между viewbag и temptdata. viewbag основан на первом представлении (не разделяется между методами действия), но temptdata может быть разделен между методом действия и только друг с другом.

Comments

    Ничего не найдено.