Asp.net 什么';“有什么不对吗?”;我;?NETMVC3
我正在阅读一本MVC书籍,并按照其中的示例创建一个音乐商店项目 在其中一个示例中,它创建一个控制器,使用URL中的参数调用一个操作方法。我发现了一些有趣的东西。代码如下:Asp.net 什么';“有什么不对吗?”;我;?NETMVC3,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,我正在阅读一本MVC书籍,并按照其中的示例创建一个音乐商店项目 在其中一个示例中,它创建一个控制器,使用URL中的参数调用一个操作方法。我发现了一些有趣的东西。代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcMusicStore.Controllers { public class S
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(intid)”中,如果我使用如下URL调用它
http://localhost:4961/store/details/6
没关系。但是,如果我将参数的名称从“id”更改为“I”,编译器不会抱怨,但当我运行它时,我会收到一条无法解释的错误消息。
部分错误消息如下所示:
参数字典包含“MvcMusicStore.Controllers.StoreController”中方法“System.String Details(Int32)”的不可为null类型“System.Int32”的参数“i”的null条目。可选参数必须是引用类型、可为null的类型或声明为可选参数。
参数名称:参数
描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源
那么,如果我只是用“I”来表示整数,那有什么错呢?您实际上必须使用变量的名称(严肃地说)。不久前我遇到了这个,当时。。。。比如说,我很惊讶。url中的条目必须与方法参数匹配。您必须严格使用变量的名称(严重)。不久前我遇到了这个,当时。。。。比如说,我很惊讶。url中的条目必须与方法参数匹配。这是因为在路由定义中使用了{id}。由于Int32是一种值类型,这意味着您必须在调用操作时为此参数传递一个值 例如,您可以这样调用它,并且仍然使用{id}保留默认路由定义
http://localhost:4961/store/details?i=6
这是因为在路由定义中使用了{id}。由于Int32是一种值类型,这意味着您必须在调用操作时为此参数传递一个值 例如,您可以这样调用它,并且仍然使用{id}保留默认路由定义
http://localhost:4961/store/details?i=6
问题是当你改变的时候
public string Details(int id)
到
然后你引入了一个突破性的变化。通过传递参数id
调用Details
的代码现在传递的参数不匹配。结果,Details
被调用,i
与任何内容都不匹配。调用和省略参数时,必须使用以下语法将参数标记为可选:
public string Details(int i = 0)
但既然不是这样,你就得到了错误。将其更改回id
,或者将调用者更改为使用i
(正如@Darin指出的,绑定来自您的默认路由定义)
您需要将这些更改为
"{controller}/{action}/{i}", // URL with parameters
new { controller = "Home", action = "Index", i = UrlParameter.Optional }, // Parameter defaults
问题是当你改变的时候
public string Details(int id)
到
然后你引入了一个突破性的变化。通过传递参数id
调用Details
的代码现在传递的参数不匹配。结果,Details
被调用,i
与任何内容都不匹配。调用和省略参数时,必须使用以下语法将参数标记为可选:
public string Details(int i = 0)
但既然不是这样,你就得到了错误。将其更改回id
,或者将调用者更改为使用i
(正如@Darin指出的,绑定来自您的默认路由定义)
您需要将这些更改为
"{controller}/{action}/{i}", // URL with parameters
new { controller = "Home", action = "Index", i = UrlParameter.Optional }, // Parameter defaults
如果我错了,你就告诉我答案。但是我认为路由中的
{id}
是一个关键字,只表示在路由中占据该位置的值将是一个id,因此是一个参数。id
起作用但i
不起作用的事实是,操作方法将参数定义为id
。它们碰巧有相同的名字,并且相互关联,但仅此而已。是的,这是真的,但Int32也是一种值类型,这就是它不起作用的原因。将i定义为string,它不会引发异常,它将为null。如果操作签名是string Details(int?i)
,它将在不修改RouteConfig的情况下工作。您在这个响应中击败了我如果我错了,请纠正我,但我认为{id}
在路由中表示为关键字,仅表示在路由中占据该位置的值将是一个ID,因此是一个参数。id
起作用但i
不起作用的事实是,操作方法将参数定义为id
。它们碰巧有相同的名字,并且相互关联,但仅此而已。是的,这是真的,但Int32也是一种值类型,这就是它不起作用的原因。将i定义为string,它不会引发异常,它将为null。如果操作签名是string Details(int?i)
它将在不修改RouteConfig的情况下工作。