In Navigation API of Silverlight 3 the UriMapper class is case sensitive. For the following uri mapping
<nav:Frame Source="/Home">
<nav:Frame.UriMapper>
<uriMapper:UriMapper>
<uriMapper:UriMapping
Uri=""
MappedUri="/Views/HomePage.xaml"/>
<uriMapper:UriMapping
Uri="/entity/{code}"
MappedUri="/Views/EntityEditorPage.xaml?code={code}"/>
<uriMapper:UriMapping
Uri="/{pageName}"
MappedUri="/Views/{pageName}Page.xaml"/>
</uriMapper:UriMapper>
</nav:Frame.UriMapper>
</nav:Frame>
the "/entity/123" is correctly mapping to "/Views/EntityEditorPage.xaml?code=123"
but "/Entity/123" will fail with the "/Views/Entity/123Page.xaml not found" exception.
How can I turn the UriMapper to case-insensitive?
Thanks.
Safor,
I did exactly what Anthony suggested for my own application.
Here is your XAML modified to use a CustomUriMapper:
<nav:Frame Source="/Home">
<nav:Frame.UriMapper>
<app:CustomUriMapper>
<app:CustomUriMapping Uri="" MappedUri="/Views/HomePage.xaml"/>
<app:CustomUriMapping Uri="/entity/{code}" MappedUri="/Views/EntityEditorPage.xaml?code={code}"/>
<app:CustomUriMapping Uri="/{pageName}" MappedUri="/Views/{pageName}Page.xaml"/>
</app:CustomUriMapper>
</nav:Frame.UriMapper>
</nav:Frame>
Here is the code for the CustomUriMapping and the CustomUriMapper classes:
using System;
using System.Collections.ObjectModel;
using System.Windows.Markup;
using System.Windows.Navigation;
namespace YourApplication
{
// In XAML:
// <app:CustomUriMapper>
// <app:CustomUriMapping Uri="/{search}" MappedUri="/Views/searchpage.xaml?searchfor={search}"/>
// </app:CustomUriMapper>
public class CustomUriMapping
{
public Uri Uri { get; set; }
public Uri MappedUri { get; set; }
public Uri MapUri(Uri uri)
{
// Do the uri mapping without regard to upper or lower case
UriMapping _uriMapping = new UriMapping() { Uri = (Uri == null || string.IsNullOrEmpty(Uri.OriginalString) ? null : new Uri(Uri.OriginalString.ToLower(), UriKind.RelativeOrAbsolute)), MappedUri = MappedUri };
return _uriMapping.MapUri(uri == null || string.IsNullOrEmpty(uri.OriginalString) ? null : new Uri(uri.OriginalString.ToLower(), UriKind.RelativeOrAbsolute));
}
}
[ContentProperty("UriMappings")]
public class CustomUriMapper : UriMapperBase
{
public ObservableCollection<CustomUriMapping> UriMappings { get { return m_UriMappings; } private set { m_UriMappings = value; } }
private ObservableCollection<CustomUriMapping> m_UriMappings = new ObservableCollection<CustomUriMapping>();
public override Uri MapUri(Uri uri)
{
if (m_UriMappings == null)
return uri;
foreach (CustomUriMapping mapping in m_UriMappings)
{
Uri mappedUri = mapping.MapUri(uri);
if (mappedUri != null)
return mappedUri;
}
return uri;
}
}
}
Good luck, Jim McCurdy
UriMapper uses regular expression try changing your mapping to "[V|v]iews/EntityEditorPage.xaml?code={code}" for starters this will make the V in view case insensi
You can't do this easily. Ultimately you will need to derive your own UriMapperBase
and do all the mapping logic yourself. Its probably not a worthwhile thing to do unless you can use some simplified mappings.