Ajax不适用于MVC自定义路由

时间:2015-05-26 12:00:26

标签: jquery ajax asp.net-mvc

我一直在经历这么多论坛以获得解决方案,但一切都是徒劳的。 我的问题是:

我的家庭控制器中有一个名为CallUser的动作。我是通过ajax来调用它的。

我的网址看起来像mydomain.com/Home/CallUser

我想要我的网址,例如mydomain.com/CallUser

我不想拥有" / Home"在访问任何行动

所以我添加了自定义路由

routes.MapRoute(
                    "Custom", 
                    "{action}/{id}", 
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );

Ajax电话:

function CallUser()
{

    var mobNum = $('#userMobileNo').val();   
    var isValidNumber=validatePhone(mobNum);
    if(isValidNumber)
    {
        $.ajax({
            url: "../Home/CallUser",
            type: "POST",
            data: JSON.stringify({ destinationNumber: mobNum }),
            datatype: "json",
            traditional: true,
            contentType: "application/json; charset=utf-8",
            success: function (data) {


            },
            error: function (err) {               

            },
            failure: function(err)
            {              

            }
        });
    }
    else
    {       

    }
}

在家庭控制器中调用博客操作

@Html.ActionLink("Blog", "Blog", "Home")

4 个答案:

答案 0 :(得分:1)

仅仅因为不喜欢URL而不是打破标准MVC模式,只需创建一个UserController并执行Call操作,以便URL变为可读:

"../User/Call"

这适用于以下网址:

"../User/Hangup"
"../User/GiveAbuse"
"../User/Ignore"
"../User/WhyDontTheyEverCall"

控制器意味着包含问题域的一部分(在这种情况下,所有操作都与用户有关),所以为什么要采用MVC的方式来实现它:)

答案 1 :(得分:0)

你有两种方式可以做你想要的ajax电话。

  

1.将您传递的ajax网址更改为网址:" ../ CallUser"

  

您需要将控制器名称添加到已创建的路径,如

routes.MapRoute(
                "Custom", 
                 "{controller}/{action}/{id}", 
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

答案 2 :(得分:0)

将此添加为您的第一条路线(在默认路线之前)

routes.MapRoute("CallUser", 
                "CallUser/{destinationNumber}", 
                new { controller = "Home", action = "CallUser"}
                );

routes.MapRoute("Blog", 
                //You may have to change parameter name based on your action signature 
                "Blog/{destinationNumber}", 
                new { controller = "Home", action = "Blog"}
                );

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });

您的操作必须具有以下签名(参数名称很重要!):

public ActionResult CallUser(string destinationNumber)
{
}

Ajax电话:

function CallUser()
{

var mobNum = $('#userMobileNo').val();   
var isValidNumber=validatePhone(mobNum);
if(isValidNumber)
{
    $.ajax({
        url: "@Url.Action("CallUser","Home")",
        type: "POST",
        data: JSON.stringify({ destinationNumber: mobNum }),
        datatype: "json",
        traditional: true,
        contentType: "application/json; charset=utf-8",
        success: function (data) {


        },
        error: function (err) {               

        },
        failure: function(err)
        {              

        }
    });
}
else
{       

}
}

答案 3 :(得分:0)

您可能想尝试使用属性路由。我喜欢在控制器中看到我脸上的路线。

您可以为控制器添加前缀,并在每个方法上方指定路径。

[RoutePrefix("books-api/loans")]
public class LoansController : ApiController
{
    private IBookRepository _bookRepository;
    public LoansController(IBookRepository bookRepository)
    {
        _bookRepository = bookRepository;
    }
    [HttpPost]
    [Route("")]
    public IHttpActionResult Post(Loan loan)
    {
        _bookRepository.Loan(loan);
        return Ok();
    }
}

您需要启用它。

这是一篇Web API文章,但我相信它也适用于MVC控制器: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2