2013年8月6日星期二

ASP.NET MVC 4使用技巧4:从controller到view传递information的方法

其实有三个方法用于传递information

    • 使用 strongly typed model object
    • 使用 ViewBag
    • 使用 dynamic type (using @model dynamic)

本来要用自己的例子,但是找到几个非常有趣的例子,来自于《Pro asp.net mvc 4 4th edition》,这里做一个引用。

关于strongly typed model object,请参考:

http://www.asp.net/mvc/tutorials/views/dynamic-v-strongly-typed-views

或《Pro asp.net mvc 4 4th edition》31页

 

关于ViewBag,它其实是一个dynamic object可以用于赋值。

以下代码源于《Pro asp.net mvc 4 4th edition》26页

Controller:

1 public class HomeController : Controller {
2 public ViewResult Index() {
3     int hour = DateTime.Now.Hour;
4     ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon";
5     return View();
6     }
7 }

View:

@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
10 <body>
11 <div>
12     @ViewBag.Greeting World (from the view)
13 </div>
14 </body>
15 </html>

 

关于用dynamic type (using @model dynamic)

以下代码子源于《Pro asp.net mvc 4 4th edition》35页

Model:

1 namespace PartyInvites.Models {
2     public class GuestResponse {
3     public string Name { get; set; }
4     public string Email { get; set; }
5     public string Phone { get; set; }
6     public bool? WillAttend { get; set; }
7     }
8 }

其中WillAttend为nullable bool,也就是它的值可以为true,false或者为null。

Controller:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PartyInvites.Models;
namespace PartyInvites.Controllers {
public class HomeController : Controller {
    public ViewResult Index() {
10         int hour = DateTime.Now.Hour;
11         ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon";
12         return View();
13     }
14     [HttpGet]
15     public ViewResult RsvpForm() {
16         return View();   
17     }
18     [HttpPost]
19     public ViewResult RsvpForm(GuestResponse guestResponse) {
20         // TODO: Email response to the party organizer
21         return View("Thanks", guestResponse);
22     }
23 }
24 }

注意的是HttpGet attribute和HttpPost attribute,告诉method是处理get还是post。

View: RsvpForm.cshtml

@model PartyInvites.Models.GuestResponse
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>RsvpForm</title>
10 </head>
11 <body>
12 @using (Html.BeginForm()) {
13     <p>Your name: @Html.TextBoxFor(x => x.Name) </p>
14     <p>Your email: @Html.TextBoxFor(x => x.Email)</p>
15     <p>Your phone: @Html.TextBoxFor(x => x.Phone)</p>
16     <p>
17     Will you attend?
18         @Html.DropDownListFor(x => x.WillAttend, new[] {
19         new SelectListItem() {Text = "Yes, I'll be there",
20         Value = bool.TrueString},
21         new SelectListItem() {Text = "No, I can't come",Value = bool.FalseString}
22         }, "Choose an option")
23         </p>
24         <input type="submit" value="Submit RSVP" />
25     }
26 </body>
27 </html>

 

View: Thanks.cshtml

@model PartyInvites.Models.GuestResponse
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Thanks</title>
10 </head>
11 <body>
12 <div>
13 <h1>Thank you, @Model.Name!</h1>
14     @if (Model.WillAttend == true) {
15     @:It's great that you're coming. The drinks are already in the fridge!
16     } else {
17     @:Sorry to hear that you can't make it, but thanks for letting us know.
18     }
19 </div>
20 </body>
21 </html>

没有评论: