属性路由返回查询字符串而不是URL

时间:2017-04-04 19:53:17

标签: c# asp.net-mvc attributerouting

这是我的控制器

[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

我将被重定向到相应的页面。

2 个答案:

答案 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?!