Javascript 为什么这个URL数据传递工作,而另一个不工作?

Javascript 为什么这个URL数据传递工作,而另一个不工作?,javascript,ajax,asp.net-mvc,Javascript,Ajax,Asp.net Mvc,因此,在我的视图中,我有两个从javascript运行的ajax请求 第一个视图实例: var id = $(element).data("id"); var fullname = $(element).data("fullname"); var count = element.checked ? -1 : 1; var rowIndex = $(element).closest("tr").index(); $.ajax({ url: "@Url.Action("Edit", "Bo

因此,在我的视图中,我有两个从javascript运行的ajax请求

第一个视图实例:

var id = $(element).data("id");
var fullname = $(element).data("fullname");
var count = element.checked ? -1 : 1;
var rowIndex = $(element).closest("tr").index();

$.ajax({
    url: "@Url.Action("Edit", "Booking")/" + id + "?fullname=" + fullname + "&type=" + count,
[HttpPost]
public int Edit(int id, string fullname, string type)
{
var type = "Table"; //this will be dynamically set later (could be type=table or type=new)
alert("[" + dateFrom + "] [" + dateTo + "]");

$.ajax({
    url: "@Url.Action("Create", "Booking")/" + type + "?datefrom=" + dateFrom + "&dateto=" + dateTo,
[HttpPost]
public JsonResult Create(string type, string dateFrom, string dateTo)
{
第一个控制器实例:

var id = $(element).data("id");
var fullname = $(element).data("fullname");
var count = element.checked ? -1 : 1;
var rowIndex = $(element).closest("tr").index();

$.ajax({
    url: "@Url.Action("Edit", "Booking")/" + id + "?fullname=" + fullname + "&type=" + count,
[HttpPost]
public int Edit(int id, string fullname, string type)
{
var type = "Table"; //this will be dynamically set later (could be type=table or type=new)
alert("[" + dateFrom + "] [" + dateTo + "]");

$.ajax({
    url: "@Url.Action("Create", "Booking")/" + type + "?datefrom=" + dateFrom + "&dateto=" + dateTo,
[HttpPost]
public JsonResult Create(string type, string dateFrom, string dateTo)
{
这将从ajax请求中生成的url传输id、fullname和type变量值。太好了

第二个视图实例:

var id = $(element).data("id");
var fullname = $(element).data("fullname");
var count = element.checked ? -1 : 1;
var rowIndex = $(element).closest("tr").index();

$.ajax({
    url: "@Url.Action("Edit", "Booking")/" + id + "?fullname=" + fullname + "&type=" + count,
[HttpPost]
public int Edit(int id, string fullname, string type)
{
var type = "Table"; //this will be dynamically set later (could be type=table or type=new)
alert("[" + dateFrom + "] [" + dateTo + "]");

$.ajax({
    url: "@Url.Action("Create", "Booking")/" + type + "?datefrom=" + dateFrom + "&dateto=" + dateTo,
[HttpPost]
public JsonResult Create(string type, string dateFrom, string dateTo)
{
第二个控制器实例:

var id = $(element).data("id");
var fullname = $(element).data("fullname");
var count = element.checked ? -1 : 1;
var rowIndex = $(element).closest("tr").index();

$.ajax({
    url: "@Url.Action("Edit", "Booking")/" + id + "?fullname=" + fullname + "&type=" + count,
[HttpPost]
public int Edit(int id, string fullname, string type)
{
var type = "Table"; //this will be dynamically set later (could be type=table or type=new)
alert("[" + dateFrom + "] [" + dateTo + "]");

$.ajax({
    url: "@Url.Action("Create", "Booking")/" + type + "?datefrom=" + dateFrom + "&dateto=" + dateTo,
[HttpPost]
public JsonResult Create(string type, string dateFrom, string dateTo)
{
第二个实例url生成得很好(我认为),因此它指向/Booking/Create/Table?datefrom=etc。但是字符串类型变量总是空的,在这种情况下,我如何获取类型变量作为“Table”

我似乎无法理解为什么第一个实例有效,但是第二个实例无效,因为它在我看来是一样的


谢谢

这是因为您的路线定义。在路由表中,您有一个如下所示的通用条目:

routes.MapRoute(
    "Default",                                              
    "{controller}/{action}/{id}",
     new { controller = "Home", action = "Index", id = "" }
);
看起来像
“{controller}/{action}/{id}”
的行是自动将提供的参数映射到一个漂亮的URL的行。注意最后一项的名称为
id
。如果在URL中发送一个名为ID的参数,它将被转换为漂亮的格式,如
Home/Index/4
。相反,相同的URL将为控制器操作的
id
参数提供
4
的值

第二个例子是,您正在传递一个名为type的参数,但是,当
type
参数是实际URL的一部分时,您没有告诉MVC如何处理它的路由(例如
controller/action/type
)。因此,MVC没有将URL的最后一部分映射到类型参数

你可以做两件事中的一件

1-创建查找名为type的参数的新路由

routes.MapRoute(
    "MyTypeRoute",                                              
    "{controller}/{action}/{type}",
     new { controller = "Home", action = "Index", type = "" }
);
2-在构建URL时,将
type
参数与其他两个参数一样对待

$.ajax({
    url: "@Url.Action("Create", "Booking")?type=" + type + "&datefrom=" + dateFrom + "&dateto=" + dateTo,

我猜可能是因为路由规则。我猜ID被识别为一个潜在的路由参数,因此从URL路径中获取,而as类型不是,除非您修改了规则。你必须按照我想要的那样做。谢谢有什么理由让管制员在路线图上显示为“家”而不是“预订”吗?@Tatrick-没有,没有理由。您可以在新路线中将控制器完全更改为“预订”!