Próbuję wdrożyć alternatywne trasowanie w mojej aplikacji internetowej MVC 5.MVC Alternatywne trasowanie kończy się niepowodzeniem z opcjonalnym parametrem
mam kod kontrolera:
namespace MyMvcProject.Web.Controllers
{
[RoutePrefix("account")]
public class AccountController : Controller {
[Route("{param}")]
[Authorize]
public ActionResult Index(string param = null) {
...
który działa wspaniale, gdy uderzenie URL: http://example.com/account/testparam
. Jednak chciałbym mieć wartość param
jako parametr opcjonalny.
Próbowałem zmienić [Route("{param}")]
na [Route("{param}*")]
, ale metoda Index()
nigdy nie została wprowadzona. Próbowałem również zmienić go na [Route("{param:string=Test}")]
, ale pojawia się błąd runtime ruting z pojęciem string
.
My RoutConfig.cs
zawiera:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{param}",
defaults: new { controller = "Home", action = "Index", param = UrlParameter.Optional }
);
}
Czy ktoś ma jakiś pomysł jak mogę zmusić Index()
mieć opcjonalny parametr przy użyciu tej alternatywnej składni routingu? Jest całkiem przydatny w innych częściach mojej aplikacji, więc chciałbym zachować dekoratory RoutePrefix
i Route
.
UPDATE
Ja wciąż próbuje dowiedzieć się tego, więc zmieniłem trasy dekorator do [Route("{param:int=0}")]
i mojego konstruktora public ActionResult Index(int id)
i działa zgodnie z oczekiwaniami (tzn http://example.com/account
zachowuje się tak, jakby http://example.com/account/0
została wpisana. to jest dokładnie to, co chcę, tylko przy użyciu string
typy danych
Kiedy zmienić dekorator. do: [Route("{id:string=\"\"}")]
i konstruktora public ActionResult Index(string id)
i widzę błąd wykonania:
The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'string'.
Pomocna wskazówka na temat zamówienia. – Nicholi