【问题标题】:MVC JQuery call from url without action来自 url 的 MVC JQuery 调用,无需操作
【发布时间】:2016-01-17 08:13:55
【问题描述】:

我有 localhost:51775/Book/Index/bookname 页面,它可以正常工作。但我想要的是从 url 中删除 Index 并使其显示为 localhost:51775/Book/bookname ,我可以根据需要进行页面链接,但这次 jquery 调用不起作用。

我已经为 routeconfig 添加了一条新路由

routes.MapRoute(
            "Book",
            "Book/{id}",
            new { controller = "Book", action = "Index", id = RouteParameter.Optional }
        );

从这个 url 作为http://localhost:51775/Book/bookname 的 Jquery 调用不起作用;

 var data = new FormData();
    data.append("comment", comment);
    data.append("id", id);

var ajaxRequest = $.ajax({
        type: "POST",
        url: "/Book/AddBookComment",
        contentType: false,
        processData: false,
        data: data
    });

但如果我删除 routeconfig 则它的工作方式为 http://localhost:51775/Book/Index/bookname

这是从jquery调用的c#方法;

[HttpPost]
    public string AddBookComment()
    {
        string comment = Request.Form["comment"];
        string id = Request.Form["id"];

        Int64 idBook = id.ToInt64();
        SuggestBusiness.Instance.AddBookComment(idBook, SessionManager.GetSession().CurrentMember.MemberId, comment);
        return "ok";
    }

localhost:51775/Book/Index/bookname 是工作页面链接,localhost:51775/Book/bookname 是我希望它工作的页面链接,localhost:51775/Book/AddBookComment 是 jquery 的 c# 方法

我应该怎么做才能进行那个 jquery 调用?

【问题讨论】:

  • 它路由RouteConfig 文件中的第一个(即在默认路由之前)?
  • 是的,这是第一个。
  • id参数只能是数字吗?
  • 然后显示你的Index()你发帖的方法。
  • 其实我不使用参数我们可以忽略它,因为我从表单数据中发送参数。

标签: jquery asp.net-mvc routes action


【解决方案1】:

由于您有一条带有url: "Book/{id}" 的路由,这意味着在您的ajax 调用中,url: "/Book/AddBookComment", 将匹配该路由并将您发送到Index() 方法。要么删除路由,要么您可以添加另一个特定路由(需要在您的 "Book" 路由之前)

routes.MapRoute(
  "BookComment",
   "Book/AddBookComment",
   new { controller = "Book", action = "AddBookComment" }
);
.... // your other routes

【讨论】:

  • 我保留了书籍页面和评论操作的路径,它有效,谢谢斯蒂芬
【解决方案2】:

url 根据区域、视图文件夹等而变化。更好的是使用 url 操作来创建 url,将该值设置为变量并在 ajax 调用中使用该变量值而不是硬编码。请参阅下面的示例

var url ='@Url.Action("YourMethod", "ControllerName")';

var ajaxRequest = $.ajax({
        type: "POST",
        url: url,
        contentType: false,
        processData: false,
        data: data
    });

@Url.Action 在外部脚本中不起作用,因此如果您使用外部脚本,则必须在视图中设置 url。

【讨论】:

    【解决方案3】:

    尝试使用以下代码注册您的路线。

    routes.MapRoute(
                "Book",
                "{controller}/{action}/{id}",
                new { controller = "Book", action = "Index", id = RouteParameter.Optional }
            );
    

    "{controller}/{action}/{id}" 用于定义一个模板,让 MVC 理解路由,然后给它一个默认实例。

    【讨论】:

    • @kubilay 我认为您应该尝试 Gayan Ranasinghe 的回答。您需要默认路由和自定义路由以满足您的要求。
    • 我已经拥有了两者,我在问题中写的 routeconfig 正在为页面链接工作。但是 jquery 调用不起作用!
    【解决方案4】:

    问题是您的默认路由操作是index,因此您不能调用AddBookComment 方法。尝试将您的默认路由操作更改为此

     routes.MapRoute(
                    "Default",
                    "{controller}/{action}/{id}",
                    new { controller = "Home", action = "Index", id = RouteParameter.Optional }
                );
        routes.MapRoute(
                    "Book",
                    "Book/{id}",
                    new { controller = "Book", action = "AddBookComment", id = RouteParameter.Optional }
                );
    

    jQuery

     var url = '@Url.Action("AddBookComment","Book")'
                        var ajaxRequest = $.ajax({
                            type: "POST",
                            url: url,
                            contentType: false,
                            processData: false,
                            data: data
                        });
    

    【讨论】:

    • 如果我按照您显示的那样更改默认路由,则项目无法正常工作。
    • 不,我的意思是保留您的默认路由,因为它可以选择将此路由添加到您的路由表中。我编辑了我的答案
    • 这次 localhost:51775/Book/bookname 链接失效了!
    • localhost:51775/Book/Index/bookname 是工作页面链接,localhost:51775/Book/bookname 是我希望它工作的页面链接,localhost:51775/Book/AddBookComment 是jquery的c#方法
    • 好的对不起,我犯了错误,将默认路由添加到路由集合的末尾。 (简单地把底部的书路由器放在顶部)
    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多