这是我的保存功能。它在一个称为“存储库”的控制器下。当我保存新的存储库时,会将其追加到我的网址中:
我了解到,这与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);
}
答案 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
参数和控制器名称一起传递,请像这样将RedirectToAction
与3 overloads一起使用:
return RedirectToAction("Index", "Repositories", new { parameterName = "value" });
注意:
RedirectToAction
使用 HTTP GET 方法,该方法将路由参数作为查询字符串传递,因此不适合使用viewmodel对象。您应该使用另一个TempData
或Session
状态实例将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。