任何机构都可以解释,何时使用
我有一个要求,我需要在控制器中设置一个值,控制器将重定向到控制器二,控制器二将呈现视图.
我试图使用ViewBag,当我到达Controller Two时,值会丢失.
我可以知道何时使用和优缺点?
谢谢
Dar*_*rov 292
1)的TempData
允许您存储为重定向而存活的数据.在内部,它使用Session作为后备存储,在重定向之后,数据被自动驱逐.模式如下:
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"];
...
}
Run Code Online (Sandbox Code Playgroud)
2)ViewBag,ViewData
允许您将数据存储在将在相应视图中使用的控制器操作中.这假定操作返回视图但不重定向.仅在当前请求期间生活.
模式如下:
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
Run Code Online (Sandbox Code Playgroud)
并在视图中:
@ViewBag.Foo
Run Code Online (Sandbox Code Playgroud)
或者使用ViewData:
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
Run Code Online (Sandbox Code Playgroud)
并在视图中:
@ViewData["Foo"]
Run Code Online (Sandbox Code Playgroud)
ViewBag它只是一个动态包装器ViewData,仅存在于ASP.NET MVC 3中.
话虽这么说,但这两种结构都不应该被使用.您应该使用视图模型和强类型视图.所以正确的模式如下:
查看型号:
public class MyViewModel
{
public string Foo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
行动:
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
强类型视图:
@model MyViewModel
@Model.Foo
Run Code Online (Sandbox Code Playgroud)
在简要介绍之后,让我们回答你的问题:
我的要求是我想在控制器1中设置一个值,该控制器将重定向到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);
}
}
Run Code Online (Sandbox Code Playgroud)
和相应的视图(~/Views/Two/Index.cshtml):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
Run Code Online (Sandbox Code Playgroud)
使用TempData也有一些缺点:如果用户在目标页面上点击F5,数据将会丢失.
我个人也不使用TempData.这是因为在内部它使用Session我在我的应用程序中禁用会话.我更喜欢一种更加RESTful的方式来实现这一目标.这是:在第一个执行重定向的控制器操作中,将对象存储在数据存储中,并在重定向时使用生成的唯一ID.然后在目标操作上使用此id来获取最初存储的对象:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
视图保持不变.
Abd*_*man 15
ASP.NET MVC为我们提供了三个选项ViewData,ViewBag和TempData,用于将数据从控制器传递到视图和下一个请求.ViewData和ViewBag几乎相似,TempData承担额外的责任.让我们讨论或获得这三个对象的关键点:
ViewBag和ViewData之间的相似之处:
ViewBag和ViewData之间的区别:
ViewBag和ViewData示例:
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
Run Code Online (Sandbox Code Playgroud)
在视图中:
@ViewBag.Name
@ViewData["Name"]
Run Code Online (Sandbox Code Playgroud)
TempData的:
TempData也是一个从TempDataDictionary类派生的字典,存储在短生命会话中,它是一个字符串键和对象值.不同之处在于物体的生命周期.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);
}
Run Code Online (Sandbox Code Playgroud)
最后一种机制是Session,它像ViewData一样工作,就像一个字典,它接受键的字符串和值的对象.这个存储在客户端Cookie中,可以使用更长时间.它还需要更多验证才能永远不会有任何机密信息.关于ViewData或ViewBag,您应该智能地使用它来提高应用程序性能.因为每个动作都经历了常规asp.net mvc请求的整个生命周期.您可以在子操作中使用ViewData/ViewBag,但请注意不要使用它来填充可能污染控制器的无关数据.
小智 11
基本上它就像一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您注意上面的代码,RedirectToAction对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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您注意上面的代码,RedirectToAction之后以及读取数据之后数据不会丢失,原因是,我们正在使用TempData.Keep().就是它
数据将持久保存到相应的视图
| 归档时间: |
|
| 查看次数: |
140829 次 |
| 最近记录: |