我一直在研究桌面应用程序,并且考虑使用ASP.Net MVC5学习Web开发,然后通过Jon Galloway阅读本书。所以我在阅读有关如何使用查询字符串(如
)将参数传递给操作方法的内容/商店/浏览?流派=迪斯科
或直接将它们嵌入网址
/商店/详情/ 5
现在我写的控制器代码(摘自书)如下:
namespace MvcMusicStore.Controllers
{
public class StoreController : Controller
{
// GET: Store
public string Index()
{
return "Hello from Store.Index()";
}
public string Browse(string genre)
{
string message = HttpUtility.HtmlEncode("Store.Browser, Genre = " + genre);
return message;
}
public string Details(int id)
{
string message = "Store.Details, ID = " + id;
return message;
}
}
}
url打开正常,操作按预期返回消息。但只是为了尝试我试图通过将其嵌入网址(例如
)来传递类型值/商店/浏览/说唱
但这不像它对Details()操作那样有效。我认为它可能需要对类型的数据类型做一些事情,所以我尝试将Details()中的id的数据类型更改为字符串,如下所示:
public string Details(string id)
{
string message = "Store.Details, ID = " + id;
return message;
}
}
并打开网址
/商店/详情/ 5
并且Details()操作返回id值为5的消息,但是当我为Browse()操作执行相同操作时
/商店/浏览/说唱
该操作不会返回带有流派值“Rap”的消息。我试图传递类型值并删除html编码,看看它是否与它有关,但事实并非如此。
我查看了帖子here,但这也没有帮助。任何评论赞赏。
答案 0 :(得分:3)
您使用Default
路由定义为
url: "{controller}/{action}/{id}",
并期望id
的值。当您使用/Store/Browse/Rap
时,第3段(" Rap")的值将绑定到名为id
的参数,但您的Browse()
方法不包含一个(名为genre
)。
更改参数的名称,使其
public string Browse(string id)
并且id
的值将是" Rap",
或创建特定路线定义并将其放在Default
路线之前(并按原样保留Browse()
方法)
routes.MapRoute(
name: "Browse",
url: "Store/Browse/{genre}",
defaults: new { controller = "Store", action = "Browse", genre = UrlParameter.Optional }
);
... // default route here
附注:如果始终传递的值为Details
int
方法中参数的类型