2010-06-11 53 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对象。

希望这会有所帮助。