Iain Sproat
Iain Sproat

Reputation: 5330

Cast route parameter in Nancy is always null

I have a Nancy module which uses a function which expects as parameters a string (a captured pattern from a route) and a method group. When trying to pass the parameter directly it will not compile as I "cannot use a method group as an argument to a dynamically dispatched operation".

I have created a second route which attempts to cast the dynamic to a string, but this always returns null.

using System;
using Nancy;

public class MyModule : NancyModule
{
    public MyModule()
    {
        //Get["/path/{Name}/action"] = parameters =>
        //    {
        //        return MyMethod(parameters.Name, methodToBeCalled); // this does not compile              
        //    };

        Get["/path/{Name}/anotherAction"] = parameters =>
            {
                return MyMethod(parameters.Name as string, anotherMethodToBeCalled);
            };
    }

    public Response MyMethod(string name, Func<int> doSomething)
    {
        doSomething();
        return Response.AsText(string.Format("Hello {0}", name));
    }

    public int methodToBeCalled()
    {
        return -1;
    }

    public int anotherMethodToBeCalled()
    {
        return 1;
    }
}

Tested with the following class in a separate project:

using System;

using Nancy;
using Nancy.Testing;
using NUnit.Framework;

[TestFixture]
public class MyModuleTest
{
    Browser browser;

    [SetUp]
    public void SetUp()
    {
        browser = new Browser(with =>
        {
            with.Module<MyModule>();
            with.EnableAutoRegistration();
        });
    }

    [Test]
    public void Can_Get_View()
    {
        // When
        var result = browser.Get("/path/foobar/anotherAction", with => with.HttpRequest());

        // Then
        Assert.AreEqual(HttpStatusCode.OK, result.StatusCode);
        Assert.AreEqual("Hello foobar", result.Body.AsString()); //fails as parameters.Name is always null when cast to a string
    }
}

You can find the whole test over on github

Upvotes: 1

Views: 702

Answers (1)

Phill
Phill

Reputation: 18796

I've had similar issues when using 'as' so I tend to use explicitly cast it:

return MyMethod((string)parameters.Name, anotherMethodToBeCalled);

Also I think there was a bug raised with the casing on parameters, but I think it's better to keep them lowercase:

Get["/path/{name}/anotherAction"]

(string)parameters.name

Your code works for me with upper case and lowercase, using the explicit cast.

Upvotes: 2

Related Questions