Как создать конкретный URL-адрес действия, когда у меня есть несколько атрибутов маршрута - PullRequest
0 голосов
/ 01 января 2019

В моем приложении у меня есть базовый класс контроллеров, который определяет два маршрута:

// 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})

1 Ответ

0 голосов
/ 01 января 2019

Такое ощущение, что ваша inline переменная должна быть именно такой: правильная переменная, переданная так, чтобы вы могли прочитать значение.Да, это усложняет объявление метода, но оно также ясно указывает любому, кто будет поддерживать вещи позже, что вы используете его для чего-то конкретного.Это также похоже на огромную гимнастику только для того, чтобы установить макет, так что, может быть, нужно провести некоторый рефакторинг, чтобы вы не пошли по этому пути?

ОК, например, редактировать, чтобы выбросить ""за то, что я думаю здесь:

[Route("/{inline:bool=yes}/[controller]")]

Я, вероятно, неправильно понимаю этот синтаксис для объявления переменной (не уверен, что могу назначить значение по умолчанию в этом контексте и т. д.), но стоит попробовать?

Однако у вас возникнут проблемы с этим, поскольку маршрут может быть недифференцируемым от других маршрутов, содержащих начальный параметр bool, поэтому я бы склонялсячтобы переместить это позже в маршрут, возможно, как последний (необязательный) параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...