проверьте второй параметр в asp.net - PullRequest
0 голосов
/ 14 ноября 2018

Я новичок в c # mvc и пытаюсь создать маршрут с несколькими параметрами, который выглядит следующим образом:

контроллер / действие / parameterOne / parameterTwo

но в некоторых случаях я просто буду использовать один из них, чтобы маршрут выглядел так:

контроллер / действие / parameterOne

вот мой RouteConfig.cs

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name:"Default2",
            url: "{controller}/{action}/{category}/{id}",
            defaults: new { controller = "Home", action = "Index", category = UrlParameter.Optional, id = UrlParameter.Optional }
        );
    }

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

[HttpGet]
    public ActionResult someAction(string category, string id)
    {
        if (String.IsNullOrWhiteSpace(id))
        {
                return View("viewOne");
        }
        else
        {
            return View("ViewTwo");
        }
    }

проблема в том, что оператор if не работает полностью? потому что, если это условие: String.IsNullOrWhiteSpace(id)

и если я напишу контроллер / действие / параметрOne , это вернет ViewOne

но если я напишу контроллер / действие / параметрOne / параметрTwo также вернет ViewOne

но теперь, если инвертировать условие, и я пишу !String.IsNullOrWhiteSpace(id), оба URL возвращают ViewTwo.

Так кто-нибудь имеет представление, почему это происходит?

1 Ответ

0 голосов
/ 14 ноября 2018

Есть ли у вас какие-либо возражения против использования только маршрута по умолчанию? Единственный недостаток, который приходит на ум, - это если вы действительно хотите, чтобы ваш URL выглядел определенным образом, и в этом случае вам может потребоваться определить несколько маршрутов, как вы пытаетесь это сделать. Однако следующее должно работать только с маршрутом по умолчанию:

//note controller actions will default to HttpGet if no data annotation is explicitly supplied. Also, action names generally begin uppercase by convention
public ActionResult SomeAction(string category, string id = null)
{
    if (String.IsNullOrWhiteSpace(id))
    {
        return View("viewOne");
    }
    else
    {
        return View("ViewTwo");
    }
}

различные упомянутые вами запросы будут выглядеть так:

www.myhost.com / контроллер / SomeAction? Категория = parameterOne & ID = parameterTwo

или

www.myhost.com / контроллер / SomeAction? Категория = parameterOne

...