В моем приложении у меня есть базовый класс контроллеров, который определяет два маршрута:
// OPControllerBase.cs
[ApiController]
[Route("/[controller]", Order = 1)]
[Route("/inline/[controller]", Order = 2)]
public abstract class OPControllerBase : Controller
{
}
Все мои производные контроллеры могут быть доступны через / [controller] или / inline / [controller].Отдельные действия украшены HttpGet / Post и могут предоставить дополнительный сегмент маршрута, представляющий действие.Вот пример производного контроллера:
public class ProductController : OPControllerBase
{
[HttpGet("Edit/{code}")]
public IActionResult Edit(string code)
{
// accessible via both:
// /Product/Edit/CODE
// /inline/Product/Edit/CODE
}
}
Внутри моего _ViewStart.cshtml я в основном выбираю компоновку в зависимости от того, по какому маршруту был вызван контроллер:
// _ViewStart.cshtml
@{
var path = ViewContext.HttpContext.Request.Path.Value;
if(path.StartsWith("/inline/"))
{
Layout = "_InlineLayout";
}
else
{
Layout = "_FullLayout";
}
}
У меня проблема в том, чточто в моем представлении мне нужно будет сгенерировать маршрут в зависимости от того, как был вызван контроллер.Если контроллер был вызван по маршруту '/ inline / [controller]', я бы хотел сгенерировать URL, которые начинаются с '/ inline /.Кроме того, я также хотел бы выбрать, какой маршрут генерировать в определенных сценариях.
В настоящее время всякий раз, когда я генерирую URL, он всегда использует первый маршрут.Как я могу заставить его использовать второй?
Редактировать: Просто чтобы уточнить, когда я говорю «создать» URL, я имею в виду использование Url.Action или аналогичного метода.Конечно, я всегда могу явно написать URL:
var productCode = "TEST";
var fullRoute = "/Product/Edit/" + productCode
var inlineRoute = "/inline/Product/Edit/" + productCode
... но это не то, что я хотел бы сделать.Я хотел бы получить что-то вроде (просто пример, который, конечно, не работает):
var productCode = "TEST";
var fullRoute = Url.Action("Edit", "Product", new { code=productCode , inline = false})
var inlineRoute = Url.Action("Edit", "Product", new { code=productCode , inline = true})