我一直在经历这么多论坛以获得解决方案,但一切都是徒劳的。 我的问题是:
我的家庭控制器中有一个名为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")
答案 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