这是我的控制器
[Authorize]
[RoutePrefix("service")]
public class ServiceController : BaseController
{
[HttpGet]
[Route("~/services")]
public ActionResult Index();
[HttpPost]
[Route]
public JsonResult Index(int rowCount, string search);
[HttpGet]
[Route("new/{subcategoryID}")]
public ActionResult New(int subcategoryID);
[HttpGet]
[Route("edit/{serviceID}")]
public ActionResult Edit(int serviceID);
[HttpPost]
[Route("edit")]
[ValidateJsonAntiForgeryToken]
public JsonResult Edit(ServiceJson service);
[HttpDelete]
[Route("delete")]
public ActionResult Delete(int serviceID);
}
当我打电话
@Url.Action("Edit", "Service", new { serviceID = service.ServiceID})
在我看来我得到了
服务/编辑?服务ID = 12
而不是
服务/编辑/ 12
为什么会这样?此控制器上没有名为Edit的其他GET操作。这让我疯狂了一段时间。
属性路由应该扫描控制器并执行路由的自动化。如果显然有一个带有此参数的操作,为什么会回退到查询字符串?
我还要注意,如果我手动输入地址
服务/编辑/ 12
我将被重定向到相应的页面。
答案 0 :(得分:1)
您应该为您的路线命名。 E.g:
def update
...
if params[:user][:password].blank? && params[:user][:password_confirmation].blank?
if @user.update_without_password(user_params)
flash[:notice] = 'User updated successfully'
redirect_to some_path
else
render :edit
end
else
if @user.update_attributes(user_params)
# login before update passing the current user
sign_in(User.find(current_user.id), :bypass => true)
flash[:notice] = 'User updated successfully'
redirect_to some_path
else
render :edit
end
end
...
end
然后生成路线网址
[Route("edit/{serviceID}", Name = "EditService")]
public ActionResult Edit(int serviceID)
你会得到
服务/编辑/ 12
在映射默认路由之前,不要忘记在 RouteConfig 中映射属性路由:
@Url.RouteUrl("EditService", new { serviceID = service.ServiceID })
答案 1 :(得分:0)
所以在经过多次尝试和错误之后我解决了这个问题,虽然我完全不知道它为什么会被修复。
问题是这个动作
[HttpPost]
[Route("edit")]
[ValidateJsonAntiForgeryToken]
public JsonResult Edit(ServiceJson service);
我删除后
[Route("edit")]
一切都按预期开始工作了。此操作不需要serviceId。它需要和对象(它期待JSON)。此外它是一个HttpPost,而不是HttpGet所以应该没有问题,因为请求本身是GET而不是POST。
为什么为什么Delilha?!