【问题标题】:What's wrong with "i"? Asp.Net MVC 3“我”有什么问题? ASP.NET MVC 3
【发布时间】:2013-05-24 05:42:42
【问题描述】:

我正在阅读 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”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。 参数名称:参数 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

如果我只使用“i”表示整数有什么问题?

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

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

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

    http://localhost:4961/store/details?i=6
    

    【讨论】:

    • 这个回复你打败了我
    • 如果我错了,请纠正我,但我认为路由中的 {id} 是一个关键字,仅表示在路由中占据该位置的值将是一个 ID,因此是范围。 id 有效但i 无效的事实是因为操作方法将参数定义为id。他们巧合地同名并相互关联,但仅此而已。
    • 是的,确实如此,但 Int32 也是一种值类型,这就是它不起作用的原因。将 i 定义为字符串,它不会抛出异常,它将为 null。
    • 如果动作签名是string Details(int? i),它可以在不修改RouteConfig的情况下工作。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      问题是当你改变时

      public string Details(int id)
      

      public string Details(int i)
      

      然后你引入一个突破性的变化。通过传递参数id 调用Details 的代码现在传递了一个不匹配的参数。结果,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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 2012-03-26
        • 2011-07-12
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多