ASP.NET Core 2.1 RedirectToAction добавляет TempData к URL - PullRequest
0 голосов
/ 11 декабря 2018

Это моя функция сохранения.Он находится под контроллером под названием Репозитории.Когда я сохраняю новый репозиторий, он добавляет это к моему URL:

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",это) как и когда я использую Redirect («Индекс»), URL просто заканчивается на / Index.Однако я бы хотел, чтобы слово 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 голосов
/ 11 декабря 2018

Основная проблема уже решена в другом ответе.

Я обращусь к

Однако я бы хотел, чтобы индексное слово было скрыто

С помощью атрибута маршрутизации вы можете установить пустой шаблон маршрута

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


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

    //...
}

Таким образом, при вызове return RedirectToAction("Index") сгенерированный URL будет тем, что был настроен в шаблоне маршрута.

Ссылка Маршрутизация к действиям контроллера в ASP.NET Core

0 голосов
/ 11 декабря 2018

Проблема заключается в следующем операторе возврата:

return RedirectToAction("Index", this);

Согласно списку перегрузок RedirectToAction , второй параметр может содержать routeValues, пока объект передается ему вместо строки:

public virtual RedirectToActionResult RedirectToAction (string actionName, object routeValues)

Следовательно, вы фактически передаете ControllerBase экземпляр как routeValues параметр.Поэтому вы должны указать вместо этого имя контроллера:

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

Если вы хотите передать параметр routeValues вместе с именем контроллера, используйте RedirectToAction с 3 перегрузками , например так:

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

Примечание:

RedirectToAction использует метод HTTP GET , который передает параметры маршрута в виде строки запроса, поэтому объект viewmodel не 'не вписывается в это.Вы должны использовать другой экземпляр состояния TempData или Session для передачи объекта viewmodel другому контроллеру.

TempData["ViewModel"] = Input;
return RedirectToAction("Index", "Repositories");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...