2010-06-11 91 views
1

我正在學習使用ASP.Net MVC創建NerdDinner的教程。但是,我正在使用Visual Studio 2010 Ultimate版本,並且只有MVC2可供選擇。關於ASP.Net控制器的新手問題MVC

所以我已經按照教程到目前爲止,一切都真正點擊,並得到很好的解釋,直到這個小小的麻煩。

該指南要求我創建一個Controller文件的新方法,像這樣:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace NerdDinner.Controllers 
{ 
    public class DinnersController : Controller 
    { 
     public void Index(){ 
      Response.Write("<h1>Coming Soon: Dinners</h1>"); 
     } 

     public void Details(int id) { 
      Response.Write("<h1>Details DinnerID: " + id + "</h1>"); 
     } 
    } 
} 

然而,當我創建了控制器文件,Visual Studio中創建的索引方法了,但它看起來大大不同於教程顯示的內容。也許這是使用MVC2做事的新方法?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace NerdDinner.Controllers 
{ 
    public class DinnersController : Controller 
    { 
     // 
     // GET: /Dinners/ 

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

我的問題是,我怎麼能重現MVC2方式的細節和索引方法(他們在MVC中)?

這是甚至相關?謝謝!

回答

2

後一種方法是正確的,所有的HTML輸出都應該通過一個View,除非你正在做一些特殊的事情。我很驚訝這本書告訴你使用空白行動。這對於MVC2來說並不陌生,我認爲這本書可能有些問題!

操作具有返回類型的ActionResult,它實際上只是一種通用的基本類型,可能是HTML,重定向或文件下載。

View()是Controller上的一種方法。它會自動查找與您的操作同名的視圖。所以DinnersController.Index()將返回位於Views/Dinners/Index.aspx的視圖。

實際上,如果你右鍵單擊View(),它會給你選擇添加一個新視圖並將其放在正確的位置。該視圖是您的HTML應該在哪裏。

+2

本書只是爲了演示如何在不設置視圖的情況下工作。稍後教程將告訴您在解釋視圖的概念時,用ActionResult返回類型替換void。是的,這有點奇怪。 – 2010-06-11 01:48:30

+0

確切地說,我覺得這個教程有點玷污了這個教程,但是他們後來真的會教你以前你在做什麼(這個問題存在的原因)是明顯錯誤的。 – 2010-06-11 02:00:49

1

你可以做以下兩種不同的方式:

  1. 通過傳遞id通過ViewData的

    public ActionResult Index() 
    { 
        ViewData["id"] = 10; 
        return View(); 
    } 
    
    <%= Html.Encode(ViewData["id"]) %> 
    
  2. 通過傳遞id通過視圖對象

    public ActionResult Index2() 
    { 
        var id = 11; 
        return View(id); 
    } 
    
    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<int>" %> 
    ... 
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
        <h2><%= Model %></h2> 
    </asp:Content> 
    
+0

我想我的問題真的是爲什麼MVC2使用ActionResult作爲返回對象,當在MVC中的返回類型是VOID。有任何想法嗎? – 2010-06-11 01:32:17

+0

因爲在MVC中該方法什麼都不返回 - 它只是直接發送數據到響應中。在MVC2方法返回數據('ActionResult'),後面將由前端控制器使用它將數據發送回客戶端 – zerkms 2010-06-11 01:36:29

0

所示教程示例未顯示MVC中的最佳做法。它在演示一個快速的「Hello World」示例時表現不錯。

最好的做法應該是返回相應的ActionResult,因爲這樣做會使您更容易進行單元測試。如果可能的話,應該避免直接使用Response對象。

希望這會有所幫助。