查询字符串参数与常规参数ASP.Net MVC 5

时间:2017-03-15 03:44:05

标签: asp.net asp.net-mvc-5 query-string

我一直在研究桌面应用程序,并且考虑使用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,但这也没有帮助。任何评论赞赏。

1 个答案:

答案 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方法中参数的类型