C#MVC中Controller与View之间数据互传⼀、Controller向View传递数据
1、使⽤ViewData传递数据
在Controller中定义如下:
ViewData[“Message_ViewData”] = “ Hello ViewData!”;
在View中读取Controller中定义的ViewData数据,代码如下:
@Html.Encode(ViewData["Message_ViewData"])
js中读取ViewData中数据如下:
<pre name="code" class="javascript"><script type="text/javascript">
var viewData = '@ViewData["Message_ViewData"]';
</script>
2、使⽤ViewBag传递数据
在Controller中定义如下:
ViewBag.Message_ViewBag =  “ Hello ViewBag !”;
在View中读取Controller中定义的ViewBag数据,代码如下:
@Html.Encode(ViewBag.Message_ViewBag)
js中读取ViewBag中数据如下:
<script type="text/javascript">
var viewBag= '@ViewBag.Message_ViewBag';
</script>
3、使⽤TempData传递数据
在Controller中定义如下:
TempData[“Message”] = “Hello word!”;
然后在View中读取Controller中定义的TempData数据,代码如下:
@Html.Encode(TempData["Message_TempData"])
js中读取TempData中数据如下:
<script type="text/javascript">
var tempData = '@TempData["Message"]';
</script>
4、使⽤Model、传递数据
⾸先要创建Model实体类:
1 public class HelloModel
2    {
3        private string _name;
4        public string Name
5        {
6            get { return _name; }
7            set { _name = value; }
8        }
9        private string _text;
10        public string Text
11        {
12            get { return _text; }
13            set { _text = value; }
14        }
15    }
使⽤Model传递数据的时候,通常在创建View的时候我们会选择创建强类型View如下图所⽰:
模型类下拉列表框中选中刚才创建的HelloModel
创建强类型的View以后,View的第⼀⾏代码如下所⽰:
@model Test.Models.HelloModel
就代表了这个View使⽤的Model为“Test.Models.HelloModel”
然后在View中读取Model中定义的数据,代码如下:
@Html.Encode(Model.Name)
js中读取Model中数据如下:
<script type="text/javascript">
var modelName = '@Model.Name';
</script>
mvc的controller总结:
1)ViewData与TempData⽅式是弱类型的⽅式传递数据,⽽使⽤Model传递数据是强类型的⽅式。
2)ViewData与TempData是完全不同的数据类型,ViewData数据类型是ViewDataDictionary类的实例化对象,⽽TempData的数据类型是TempDataDictionary类的实例化对象。
3)TempData实际上保存在Session中,控制器每次执⾏请求时都会从Session中获取TempData数据并删除该Session。TempData数据只能在控制器中传递⼀次,其中的每个元素也只能被访问⼀次,访问之后会被⾃动删除。
4)ViewData只能在⼀个Action⽅法中进⾏设置,在相关的视图页⾯读取,只对当前视图有效。理论上,TempData应该可以在⼀个Action中设置,多个页⾯读取。但是,实际上TempData中的元素被访问⼀次以后就会被删除。
5)在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使⽤ViewData。MVC3中保留了ViewData的使⽤,有关他们之间的区别可以参考这个⽂章。
⼆、View向Controller传递数据
在ASP.NET MVC中,将View中的数据传递到控制器中,主要通过发送表单的⽅式来实现。具体的⽅式有:
1、通过Request.Form读取表单数据
我们在View层做如下定义:
1 @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
2 {
3    @Html.TextBox("Name");
4    @Html.TextBox("Text");
5    <input type="submit" value="提交" />
6 }
注意:
HelloModelTest为对应的Action名,Home为对应的Controller名称。
然后在Controller层,通过Request.Form读取表单数据的代码如下所⽰:
1 [HttpPost]
2        public ActionResult HelloModelTest()
3        {
4            string name= Request.Form["Name"];
5            string text= Request.Form["Text"];
6            return View();
7        }
2、通过FormCollection读取表单数据
我们在View层做如下定义:
1 @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
2 {
3    @Html.TextBox("Name");
4    @Html.TextBox("Text");
5    <input type="submit" value="提交" />
6 }
然后在Controller层,通过FormCollection读取表单数据的代码如下所⽰:
2        public ActionResult HelloModelTest(FormCollection fc)
3        {
4            string name= fc["Name"];
5            string text  = fc["Text"];
6            return View();
7        }
3、模型绑定
我们在View层做如下定义:
1 @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
2 {
3    @Html.TextBox("Name");
4    @Html.TextBox("Text");
5    <input type="submit" value="提交" />
6 }
默认的模型绑定:
相较于从请求中获取表单值,下⾯的Edit Action则是简单地以⼀个模型对像为参数(Album):
[HttpPost]
public ActionResult HelloModelTest( HelloModel model)
{
// ...
}
当你的Action⽅法是以⼀个模型对象充当参数时,MVC运⾏时将会⽤模型绑定来构建该参数。默认⽤于模型绑定的是DefaultModelBinder,以上述的HelloModel为例,DefaultModelBinder将会检索出所有可⽤的HelloModel属性⽤于绑定模型。根据命名约定,DefaultModelBinder能够⾃动地在请求中获取相应的值来填充HelloModel对象(它还能创建⼀个对象的实例来填充)
换句话说,假设HelloModel有⼀个Name属性,那么模型绑定就会在请求中查名为Name的参数。注意我说的是在“请求中”,⽽不
是“表单集合”中。模型绑定会在请求中的各个⽅⾯进⾏值查,这⾥⾯包括路由数据,查询字符串,表单集合。有必要的话你还可以添加⾃定义的值提供信息。
模型绑定不并局限于Http Post及复杂参数(如HelloModel),你完全可以传⼊⼀个原始的简单参数:
public ActionResult HelloModelTest( string name,string text)
// ….
在该场景中,模型绑定将会在请求中查名为name,text 的参数。
显⽰模型绑定:
当Action有参数的时候,会隐式地执⾏模型绑定。你还可以在控制器⾥⾯使⽤UpdateModel和 TryUpdateModel来显式调⽤模型绑定。调⽤UpdateModel的时候,如果模型对象是⽆效的或者绑定期间发⽣错误则会抛出异常。TryUpdateModel则不会抛出异常,它返回⼀个布尔值:如果绑定成功并且模型验证通过则返回true,否则返回false。
public ActionResult HelloModelTest( )
{
HelloModel model = new HelloModel();
if (this.TryUpdateModel(model))
{
/
/绑定成功
}
else
{
//绑定失败
}
}
模型状态是模型绑定产⽣的副产物。每次绑定器绑定值到模型时,都会在模型状态中进⾏记录。你可以在模型绑定之后查看模型状态来判断
绑定是否成功:
[HttpPost]
public ActionResult HelloModelTest( )
{
HelloModel model = new HelloModel();
this.TryUpdateModel(model);
if (ModelState.IsValid)
{
//绑定成功
}
else
{
<pre code_snippet_id="569649" snippet_file_name="blog_20150102_21_3590846" name="code" class="csharp"><span >    </span>//绑定}}
如果在模型绑定过程中发⽣异常,模型状态⾥⾯就会包含导致异常的那个属性名,绑定值以及错误信息。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。