zoukankan      html  css  js  c++  java
  • ASP.NET MVC之从控制器传递数据到视图方式

           为了演示,先定义一个类

           新建基本项目在Models文件夹下定义如下类:

    public class Person
        {
            public int Id { get; set; }
    
            public string Name { get; set; }
    
            public string BlogAddress { get; set; }
    
            public string Description { get; set; }
        }

           我们在控制器的Action方法中实例化此类:

                var p = new Person()
                {
                    Id = 98,
                    Name = "xpy0928",
                    BlogAddress = "http://www.cnblogs.com/CreateMyself",
                    Description = "出生非贫即贵,你我无能为力,后天若不加以努力赶之超之,又能怪谁呢!自己都靠不住不靠谱,又能靠谁呢!"
                };

        

    方式1 (ViewData)

    我们利用ViewData以键值对的形式来存储上述实例化的对象,如下:

    ViewData["Person"] = p;

    在视图中我们从ViewData中获取存储的值并转换成对象,如下:

    @using ASP.NET_MVC_1.Models;  //引用模型模块,视图中HTML中使用Razor书写格式 @+C#代码
    
    @{
        var p = (Person)ViewData["Person"];
    }

    接着我们获取对象中的值:

    <h1>Person</h1>
    <h3>@p.Id</h3>   //Razor视图中C#代码前加@
    <h3>@p.Name</h3>
    <h3>@p.BlogAddress</h3>
    <h3>@p.Description</h3>

    运行结果如下

     方式2(ViewBag)

    将控制器Action方法以ViewBag创建动态表达式来进行,如下:

    ViewBag.Person = p;

    在视图中,我们进行如下修改:

    @using ASP.NET_MVC_1.Models;
    
    @{
        var p = ViewBag.Person as Person;
    }

    获取对象值同上,我们继续看看是否如我们所预想:

    方式3(Model) 

              var p = new Person()
                {
                    Id = 98,
                    Name = "xpy0928",
                    BlogAddress = "http://www.cnblogs.com/CreateMyself",
                    Description = "出生非贫即贵,你我无能为力,后天若不加以努力赶之超之,又能怪谁呢!自己都靠不住不靠谱,又能靠谁呢!"
                };
                return View(p);

    此时视图中,我们将需要得到该强类型对象: 而获取对象的值则通过Model来获取,如下:

    @using ASP.NET_MVC_1.Models;
    
    @model Person;

    <h1>Person</h1>
    <h3>@Model.Id</h3>
    <h3>@Model.Name</h3>
    <h3>@Model.BlogAddress</h3>
    <h3>@Model.Description</h3>
     

    结果

    方式4(TempData) 

    从字面意思来理解我们会误认为是临时对象,好像就使用一次就不会再用了,确实是这样吗?很显然不是这样,当然其生命周期确实很短。该对象是将数据从一个控制器的方法传递到另外一个方法上。什么意思呢?我们想象这样一个场景:当我们在控制器的Info方法上添加一个Person的信息后,我们跳转到另外一个方法TempDataObject上来显示该对象已经成功被创建。

    下面我们来演示这种场景:

            public ActionResult Info()
            {
                var p = new Person()
                {
                    Id = 98,
                    Name = "xpy0928",
                    BlogAddress = "http://www.cnblogs.com/CreateMyself",
                    Description = "出生非贫即贵,你我无能为力,后天若不加以努力赶之超之,又能怪谁呢!自己都靠不住不靠谱,又能靠谁呢!"
                };
                //TODO 添加Person到数据库中
                TempData["info"] = "提示:已经成功添加一条数据到数据库中";
                return RedirectToAction("TempDataObject");
            }

    创建一个TempData方法,获取上面传递过来的值,如下:

         public ActionResult TempDataObject()
            {
                return View();
            }

    在方法对应的视图获取传递过来的值:

    <h1>@TempData["info"]</h1>

    我们通过访问Info,观察当跳转过来到该方法时后渲染视图是否能够获取到该值:

    当然在上述过程中这是利用将一个Action中的数据通过TempData传递到另外一个Action中,但是我们需注意,这是利用跳转到TempDataObject才会正确显示数据,如果我们直接刷新页面将会出现System.NullReferenceException。 

    方式5(Json数据) 

    数据存储模型Model:

    public class CalendarEvent
     {
         public string id { get; set; }
         public DateTime start { get; set; }
         public DateTime end { get; set; }
         public string backgroundColor { get; set; }
         public string title { get; set; }
         public string allDay { get; set; }
     }

    后台处理数据控制器Controller:

    public JsonResult CalendarData()
     {
         Operation op = new Operation();
         List<CalendarEvent> calendarData = op.GetData();
         return Json(calendarData, JsonRequestBehavior.AllowGet);
     }

    前端代码,使用javascript解析Json数据

    <script type="text/javascript">
     $(function () {
         //calendar handle data as follows:
    
        var events = [];
         $.ajax({
      url: "/DeploymentTask/CalendarData",
      success: function (data) {
          events = data;
      },
      async: false
         });
    
        $("#calendar").fullCalendar({
    
     header: {
          left: 'prev,next today',
          center: 'title',
          //right: 'month,agendaWeek,agendaDay'
          right: 'month'
      },
      selectable: true,
      weekMode: 'variable',//fixed,variable,liquid
      events: events,
      defaultEventMinutes: 1440  //默认事件长度为一天
        });
     });
     </script>
  • 相关阅读:
    Enterprise Library系列文章回顾与总结
    .NET设计模式系列文章
    从Google趋势看.NET下的Ajax框架
    Atlas学习手记(18):使用DragPanel实现拖放面板
    Atlas学习手记(2):全面了解ScriptManager
    .NET设计模式(17):命令模式(Command Pattern)
    Atlas学习手记(3):由UpdatePanel开始
    Atlas学习手记(16):使用PasswordStrength检测密码强度
    Atlas学习手记(17):使用FilteredTextBox过滤字符
    用Windows Live Writer在博客园发布Post
  • 原文地址:https://www.cnblogs.com/CelonY/p/10424033.html
Copyright © 2011-2022 走看看