0

我正在阅读 MVC 书籍并按照其中的示例创建一个音乐商店项目。

在其中一个示例中,它创建了一个控制器,在 URL 中调用一个带有参数的操作方法。我发现了一些有趣的东西。这是代码:

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

namespace MvcMusicStore.Controllers
{
    public class StoreController : Controller
    {
    //
    // GET: /Store/

    public string Index()
    {
        return "Hello from Store.Index()";
    }

    // GET: /Store/Browse?genre=?Disco
    public string Browse(string genre)
    {
        string message =
        HttpUtility.HtmlEncode("Store.Browse, Genre = " + genre);
        return message;
    }
    //
    // GET: /Store/Details/5
    public string Details(int id)
    {
        string s = "Store.Details, ID = " + id;

        return s;
    }

    }
}

在最后一个方法“Details(int id)”中,如果我使用类似的 URL 调用它

http://localhost:4961/store/details/6

没关系。但是,如果我将参数的名称从“id”更改为“i”,编译器不会抱怨,但是当我运行它时,我会收到一条我无法解释的错误消息。部分错误信息是这样的:

参数字典包含“MvcMusicStore.Controllers.StoreController”中方法“System.String Details(Int32)”的不可空类型“System.Int32”的参数“i”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:parameters 描述:当前web请求执行过程中发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

那么如果我只使用“i”作为整数有什么问题呢?

4

3 回答 3

4

这是因为在您的路线定义中您使用了 {id}。因为 Int32 是一种值类型,这意味着您必须在调用操作时为此参数传递一个值。

例如,您可以这样调用它,并且仍然使用 {id} 保留默认路由定义

http://localhost:4961/store/details?i=6
于 2013-05-23T21:42:31.840 回答
0

从字面上看,您必须使用变量的名称(说真的)。不久前我遇到了这个问题,并且……可以说,很惊讶。url 中的条目必须与方法参数匹配。

于 2013-05-23T21:41:47.063 回答
0

问题是当你改变

public string Details(int id)

public string Details(int i)

然后你引入一个突破性的变化。Details通过传递参数调用的代码id现在正在传递一个不匹配的参数。结果,Details被调用并且i不匹配任何内容。调用和省略参数时,必须使用以下语法将参数标记为可选:

public string Details(int i = 0)

但既然不是,你就会得到错误。要么将其更改回id,要么更改要使用的调用者i(正如@Darin 指出的那样,绑定来自您的默认路由定义)。

"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults

您需要将这些更改为

"{controller}/{action}/{i}", // URL with parameters
new { controller = "Home", action = "Index", i = UrlParameter.Optional }, // Parameter defaults
于 2013-05-23T21:42:42.190 回答