我正在学习使用ASP.Net MVC创建NerdDinner的教程。但是,我使用的是Visual Studio 2010 Ultimate版,只有MVC2可供选择。
所以到目前为止我已经按照教程进行了操作,所有内容都非常简单,并且非常好解释,直到这个小故障。
该指南要求我在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>");
}
}
}
但是,当我创建Controllers文件时,Visual Studio已经创建了一个Index方法,但它看起来与教程显示的非常不同。也许这是使用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中)?
这甚至是相关的吗?谢谢!
答案 0 :(得分:2)
后一种方法是正确的,所有HTML输出都应该通过View,除非你做的事情非常特殊。我很惊讶这本书告诉你使用空洞进行动作。这对MVC2来说并不陌生,我想这本书可能有问题!
动作的返回类型为ActionResult,它实际上只是一种通用的基本类型,可能是HTML,重定向或文件下载。
View()是Controller上的一个方法。它将自动查找与您的Action同名的View。所以DinnersController.Index()将返回位于Views / Dinners / Index.aspx的视图。
事实上,如果右键单击View(),它将为您提供添加新视图并将其放在正确位置的选项。该视图是您的HTML所在的位置。
答案 1 :(得分:1)
您可以通过以下两种方式实现这一目标:
将id
传递给ViewData
public ActionResult Index()
{
ViewData["id"] = 10;
return View();
}
<%= Html.Encode(ViewData["id"]) %>
将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>
答案 2 :(得分:0)
显示的教程示例未显示MVC中的最佳实践。它在展示快速“Hello World”示例方面做得很好。
最佳做法应该是返回相应的ActionResult,因为这样做会使您更容易进行单元测试。如果可能,应避免直接使用Response对象。
希望这有帮助。