Shorten code to perform search based on four slash-delimited parameters
Code Structure


It is quite tedious what you trying to do in the first piece of code. You might as well just pass the string array directly. As accessing an indexed element is not much different than variable named like paramx.
The second piece of code is mirrored from the middle. The lower section and upper section are essentially doing the same job with only 1 offset in parameter, and ViewType being different.
Never repeatedly make the same test, if possibly. Try to process by reduction and elimination, or change the flow of code.


Logic Flaws


When only one argument or two arguments (that begins with "Map" or  "Kort") are passed, then Area is being assigned instead of Country.

else if (!string.IsNullOrWhiteSpace(param1))
{
    SearchType = SearchStateType.Address;
    Area = param1.ToUnfriendlyUrl();
}

When 3 or 4(with Map/Kort) arguments are passed, SubArea is assigned before Area.

if (!string.IsNullOrWhiteSpace(param1) &amp;&amp; !string.IsNullOrWhiteSpace(param2) &amp;&amp; !string.IsNullOrWhiteSpace(param3))
{
    Country = param1.ToUnfriendlyUrl();
    Area = param3.ToUnfriendlyUrl();
    SearchType = SearchStateType.Address;
    SubArea = param2.ToUnfriendlyUrl();
}





Polished Code

SearchState = new RoomSearchState(parameters.Split('/'))




public RoomSearchState()
{
    SearchType = SearchStateType.Empty;
    ViewType = "Default";
}

public RoomSearchState(string[] args) : this()
{
    if (!args.Any()) return;

    if (args[0] == "Kort" || args[0] == "Map")
    {
        ViewType = "Map";
        args = args.Skip(1).ToArray();
    }

    switch(args.Length)
    {
        case 1:
            if (args[0].StartsWith("@"))
            {
                Country = args[0];
                SearchType = SearchStateType.Coordinates;
            }
            else
            {
                Country = args[0].ToUnfriendlyUrl();
                SearchType = SearchStateType.Address;
            }
            break;
        case 2:
            Country = args[0].ToUnfriendlyUrl();
            Area = args[1].ToUnfriendlyUrl();
            SearchType = SearchStateType.Address;
            break;
        case 3:
            Country = args[0].ToUnfriendlyUrl();
            Area = args[1].ToUnfriendlyUrl();
            SubArea = args[2].ToUnfriendlyUrl();
            SearchType = SearchStateType.Address;
            break;
        default: throw new ArgumentException("args");
    }
}