Mvc3(4)

摘录于Pro ASP.NET MVC3 Framework一书:

Controllers and Actions

1.Actions方法不能带有out/ref参数,ASP.NET MVC遇到这种情况会简单的抛出异常

2.可选/必须参数

      a. 当mvc framework不能为一个引用类型参数赋值时,这个action 方法还是会被调用,mvc framework为会这个参数赋null
      b. 当mvc framework不能为一个值类型参数赋值时,这个action 方法不会被调用,会抛异常      
      我们可以针对这两种情况做点限制处理:
      a. 引用类型是可选的,也就是可以不赋值,为了避免参数的值为null,可以在这个action方法里加代码【加在最前面】作判断,然后做相应处理,比如:如果为null,就让程序抛出异常
      b. 值类型是必须的,为了防止出现异常,可以先为这个参数赋一个默认值,或者将它声明为一个可空类型[Nullable]
      格式为:int? myvalue;
      //这样,myvalue就可以接收null值了【没有被赋值的情况下,为null值】

3.关于Action中的View方法

  View方法的作用是:形成相应的Html片断,然后返回给浏览器

   a. specifying a view by its path      

   可以直接显示指定路径下的view,从而mvc framework就不用再去搜索了

      public class ExampleController : Controller {
              public ViewResult Index() {
                  return View("~/Views/Other/Index.cshtml");
              }
      }

//When you specify a view like this, the path must begin with / or ~/ and include the file name extension

   b. 直接指定view的名字

   public class ExampleController : Controller {
            public ViewResult Index() {
                     return View("Homepage");//显示Homepage view
           }
   }

   c. 可以不指定view的名字

   public class ExampleController : Controller {
            public ViewResult Index() {
                     return View();//MVC Framework会显示 Index view
           }
   }

   d. 通过Action向view传值

       1)通过 View Model Object 来实现
        public ViewResult Index() {
               DateTime date = DateTime.Now;
               return View(date);
        }

    //这里,DateTime 对象作为 一个view model传递,这样就可以在视图(view)中通过用Razor中的关键字---"Model"来访问它了

    视图部分如下:        

    @{  ViewBag.Title = "Index"; }        

     <h2>Index</h2>        

     The day is: @(((DateTime)Model).DayOfWeek)//这是个弱类型,视图根本就不知道传过来的是哪种类型,我们可以告诉视图是哪个类型,那就是建一个强类型,如下

     强类型视图:
        @model DateTime   //指定Model的类型
       @{
               ViewBag.Title = "Index";
          }
        <h2>Index</h2>
        The day is: @Model.DayOfWeek  //Model就不用类型转换了

4.Action可以通过ViewBag来传值

  通过ViewBag可以设定任意属性并为其赋值,然后在页面上获取该属性值即可

  public ViewResult Index() {
           ViewBag.Message = "Hello";
           ViewBag.Date = DateTime.Now;
           return View();
  }

  视图部分如下:
      @{
            ViewBag.Title = "Index";
         }
      <h2>Index</h2>
      The day is: @ViewBag.Date.DayOfWeek
      </p>
      The message is: @ViewBag.Message

5.Action可以通过View Data来传值

public ViewResult Index() {
             ViewData["Message"] = "Hello";
             ViewData["Date"] = DateTime.Now;
             return View();
}

视图部分如下:
      The day is: @(((DateTime)ViewData["Date"]).DayOfWeek)
      <p />
      The message is: @ViewData["Message"]
      ---ViewBag是在MVC3里才有的,之前用来等价于View Model方法的就是ViewData,
      ViewData特性类似于ViewBag,只不过它是用ViewDataDictionary类来实现的,而ViewBag是采用动态对象方式

6.Action可以通过TempData来传值

public ViewResult Index() {
             TempData["Message"] = "Hello";
             return View();
}

视图部分如下:
      The Message is: @TempData["Message"]

至于ViewBag,ViewData,TempData三者之间的差别,在http://www.cnblogs.com/notebook2011/archive/2012/11/29/2794478.html有记录

7.实现跳转

   1)跳转有两种:a. 301【永久的重定向】:搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址

                    b. 302【暂时的重定向】:搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。

   临时跳转Redirect【302】:

   public RedirectResult Redirect() {
               return Redirect("/Example/Index");
   }

   永久性跳转RedirectPermanent【301】:

   public RedirectResult Redirect() {
               return RedirectPermanent("/Example/Index");
    }

   2)以上还有两种替代方法:

   RedirectToRoute【302】:

    public RedirectToRouteResult Redirect() {
             return RedirectToRoute(new {
                    controller = "Example",
                    action = "Index",
                    ID = "MyID"
                  });
      }

   RedirectToRoutePermanent【301】:

   public RedirectToRouteResult Redirect() {
             return RedirectToRoutePermanent(new {
                    controller = "Example",
                    action = "Index",
                    ID = "MyID"
                  });
      }

    3)跳转到某个action

       public RedirectToRouteResult Redirect() {
              return RedirectToAction("Index");
       }

       //这种仅仅指定了action名,没有指定controller,那么就默认为是当前的controller             

       //If you want to redirect to another controller, you need to provide the name as a parameter,like this:     

       return RedirectToAction("Index", "MyController");

       //RedirectToAction是临时跳转; RedirectToActionPermanent是永久性跳转

    

原文地址:https://www.cnblogs.com/notebook2011/p/2809348.html