在MVC中,Controller和View之间是如何传递数据的呢?
@model _01FirstMVC.Models.Models,这段代码代码了这个View使用的Model为“_01FirstMVC.Models.Models”
然后Model.就能有智能提示啦,会显示Model中定义的所有属性。
Controller向View传递数据四种方式:
ViewBag的类型为dynamic,动态数据类型(可以动态添加属性,类似于JS里的对象,因为此种对象在运行时才知道对象的类型,所以编译器和VS都无法推断产生只能提示。)本质上就是Object。
ViewBag和ViewData是共享数据的。也就是说如何在Controller中包含:ViewData["hengshuiTGB"] = "衡水大米时代"; 那么在View中也可以采用@ViewBag.hengshuiTGB,来获取“衡水大米时代”。而TempData和上述两个是不共享数据的。
Model属性其实就是ViewData.Model,当我们在Action方法中,通过View(obj)将数据传递给视图对象时,其实就是把数据设置给了ViewData.Model。然后随ViewData传递到视图的ViewData属性中。
Controller
View
在这个小栗子中,ModelBinder将会帮你创建model对象,并且使用从Request中获得的数据来填空这个对象。真是太神奇啦。
比如StuModel有一个StudentID属性,那么ModelBinder就会在HTTP请求中查找名为StudentID的参数。ModelBinder会在请求中的各个方面进行查找。如表单集合、URL、input隐含域等。
当然ModelBinder并不局限于[AcceptVerbs(HttpVerbs.Post)]以及复杂参数(StuModel),我们也可以传入一个原始的简单参数。
在该场景中,模型绑定将会在请求中查找名为id,name的参数。
一、Controller向View传递数据
1、ViewBag
Controller public ViewResult TransData()
{
ViewBag.TGB = "大米时代";
return View();
}
View<head>
<meta name="viewport" content="width=device-width" />
<title>TransData</title>
</head>
<body>
<div>
@ViewBag.TGB <br />
</div>
</body>
2、ViewData
Controller public ViewResult TransData()
{
ViewData["hengshuiTGB"] = "衡水大米时代";
return View();
}
View<head>
<meta name="viewport" content="width=device-width" />
<title>TransData</title>
</head>
<body>
<div>
@ViewData["hengshuiTGB"] <br />
</div>
</body>
3、TempData
Controller public ViewResult TransData()
{
TempData["beijingTGB"] = "北京大米时代";
return View();
}
View<head>
<meta name="viewport" content="width=device-width" />
<title>TransData</title>
</head>
<body>
<div>
@TempData["beijingTGB"]<br />
</div>
</body>
4、Model
Controllerpublic ViewResult TransData()
{
Models.Models modelClass = new Models.Models() { cname="广州大米时代"};
ViewData.Model = modelClass;
return View();
}
View<head>
<meta name="viewport" content="width=device-width" />
<title>TransData</title>
</head>
<body>
<div>
@Model.cname <br />
@ViewData.Model.cname
</div>
</body>
使用Model传递数据的时候,通常在创建View的时候,我们会选择强类型View如下图所示。 模型类下拉框中选择自己创建的Models。
创建强类型view以后,View的第一行代码如下所示:
@model _01FirstMVC.Models.Models,这段代码代码了这个View使用的Model为“_01FirstMVC.Models.Models”
然后Model.就能有智能提示啦,会显示Model中定义的所有属性。
Controller向View传递数据四种方式:
ViewBag的类型为dynamic,动态数据类型(可以动态添加属性,类似于JS里的对象,因为此种对象在运行时才知道对象的类型,所以编译器和VS都无法推断产生只能提示。)本质上就是Object。
ViewBag和ViewData是共享数据的。也就是说如何在Controller中包含:ViewData["hengshuiTGB"] = "衡水大米时代"; 那么在View中也可以采用@ViewBag.hengshuiTGB,来获取“衡水大米时代”。而TempData和上述两个是不共享数据的。
Model属性其实就是ViewData.Model,当我们在Action方法中,通过View(obj)将数据传递给视图对象时,其实就是把数据设置给了ViewData.Model。然后随ViewData传递到视图的ViewData属性中。
二、View向Controller传递数据
在ASP.NET MVC中,将View中的数据传递到控制器中,主要通过发送表单的方式来实现。具体的方式如下。
1、Request.Form[]
View<body>
<div>
@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
{
@Html.TextBox("Name");
@Html.TextBox("Text");
<input type="submit" value="提交" />
}
</div>
</body>
注意:HelloModelTest为对应的Action方法名,Home为对应的Controller名称。在HomeController类文件中写如下代码。Controller
[HttpPost]
public ActionResult HelloModelTest()
{
string name = Request.Form["Name"];
string text = Request.Form["Text"];
return View();
}
2、FormCollection
View<body>
<div>
@using (Html.BeginForm("HelloModelTest1", "Home", FormMethod.Post))
{
@Html.TextBox("Name");
@Html.TextBox("Text");
<input type="submit" value="提交" />
}
</div>
</body>
Controller [HttpPost]
public ActionResult HelloModelTest1(FormCollection fc)
{
string name = fc["Name"];
string text = fc["Text"];
return View();
}
3、模型绑定
Model Binding(模型绑定)是HTTP请求和Action方法之间的桥梁。Action方法需要数据,在传入的HTTP请求中携带着你需要的数据。数据可以在请求的表单数据中,可以在URL地址本身中,还可以在input隐含域中。通过DefaultModelBinder,可以将表单中的数据、URML中的数据、隐含域中的数据转换到对象中。Model Binder使得你的控制器代码可以从请求以及关联的环境中分离出来。[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(StuModel model)
{
// ...
return View();
}
在这个小栗子中,ModelBinder将会帮你创建model对象,并且使用从Request中获得的数据来填空这个对象。真是太神奇啦。
比如StuModel有一个StudentID属性,那么ModelBinder就会在HTTP请求中查找名为StudentID的参数。ModelBinder会在请求中的各个方面进行查找。如表单集合、URL、input隐含域等。
当然ModelBinder并不局限于[AcceptVerbs(HttpVerbs.Post)]以及复杂参数(StuModel),我们也可以传入一个原始的简单参数。
public ActionResult HelloModelTest( string name,string text) {
// …
}
在该场景中,模型绑定将会在请求中查找名为id,name的参数。