ASP.NET Core 2.1 RedirectToAction将TempData附加到url

时间:2018-12-11 01:11:01

标签: c# asp.net asp.net-mvc asp.net-core

这是我的保存功能。它在一个称为“存储库”的控制器下。当我保存新的存储库时,会将其追加到我的网址中:

  

https://localhost:44325/Repositories/Repositories?TempData=%5BSuccess,%20Repository%20Created%5D&ViewBag=Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.DynamicViewData&HttpContext=Microsoft.AspNetCore.Http.DefaultHttpContext&Request=Microsoft.AspNetCore.Http.Internal.DefaultHttpRequest&Response=Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse&RouteData=Microsoft.AspNetCore.Routing.RouteData&ModelState=%5BName,%20Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary%2BModelStateNode%5D&ControllerContext=Microsoft.AspNetCore.Mvc.ControllerContext&MetadataProvider=Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadataProvider&ModelBinderFactory=Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderFactory&Url=Microsoft.AspNetCore.Mvc.Routing.UrlHelper&ObjectValidator=Microsoft.AspNetCore.Mvc.Internal.DefaultObjectValidator&User=System.Security.Claims.ClaimsPrincipal

我了解到,这与RedirectToAction(“ Index”,this)有关,因为当我使用Redirect(“ Index”)时,URL仅以/ Index结尾。但是,我希望索引字被隐藏,而RedirectToAction可以做到这一点。我该如何解决这个问题?

public IActionResult Index()
{
    return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(CreateRepositoryViewModel Input)
{
    if (!ModelState.IsValid)
    {
        return View("Create", Input);
    }
    var directory = directoriesController.Create(Input);
    if (directory != null)
    {
        Input.Path = directory;
        var result = repositoriesData.Save(Input);
    }
    else
    {
        TempData["Error"] = "Repository Creation" + LoggingGlobals.Error;
        return RedirectToAction("Index", this);
    }
    TempData["Success"] = "Repository " + LoggingGlobals.Create;
    return RedirectToAction("Index", this);
}

2 个答案:

答案 0 :(得分:1)

问题出在以下return语句中:

return RedirectToAction("Index", this);

根据RedirectToAction overloads list,第二个参数可能包含routeValues,而对象被传递给它而不是字符串:

public virtual RedirectToActionResult RedirectToAction (string actionName, object routeValues)

因此,您实际上是将ControllerBase实例作为routeValues参数传递。因此,您应该改为提供控制器名称:

return RedirectToAction("Index", "Repositories");

如果您想将routeValues参数和控制器名称一起传递,请像这样将RedirectToAction3 overloads一起使用:

return RedirectToAction("Index", "Repositories", new { parameterName = "value" });

注意:

RedirectToAction使用 HTTP GET 方法,该方法将路由参数作为查询字符串传递,因此不适合使用viewmodel对象。您应该使用另一个TempDataSession状态实例将viewmodel对象传递给另一个控制器。

TempData["ViewModel"] = Input;
return RedirectToAction("Index", "Repositories");

答案 1 :(得分:0)

已经在另一个答案中解决了主要问题。

我会致信

  

但是,我希望隐藏索引词

使用属性路由,您可以设置一个空的路由模板

[Route("[controller]")]
public class RepositoriesController {


    [HttpGet]
    [Route("")] //GET Repositories
    [Route("[action]")] //GET Repositories/Index
    public IActionResult Index() {
        return View();
    }

    //...
}

这样,在调用return RedirectToAction("Index")时,生成的URL将是在路由模板中配置的URL。

引用Routing to controller actions in ASP.NET Core