6

I have a requirement to create a Get method which takes the following parameter names in the URL:

ms-scale ms-contrast ms-lang

As you can see, all the names have a dash in them which is not possible in C#. How can I map my method to these parameter names?

public HttpResponseMessage Get(int scale, string contrast string lang)
1
  • It can be done though custom model binder. Commented Sep 6, 2012 at 10:59

2 Answers 2

9

Use FromUriAttribute

public HttpResponseMessage Get([FromUri(Name = "ms-scale")]int scale, [FromUri(Name = "ms-contrast")]string contrast, [FromUri(Name = "ms-lang")]string lang)
Sign up to request clarification or add additional context in comments.

1 Comment

This should be accepted answer. No need to write custom binders or whatever - just out-of-box solution.
4

I was asked this before somewhere else and found this answer:

Using a dash (-) in ASP.MVC parameters

Updated

In order to get this working with Web API we need to modify it a bit.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class BindParameterAttribute : ActionFilterAttribute
{
    public string ViewParameterName { get; set; }
    public string ActionParameterName { get; set; }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var viewParameter = actionContext.Request.RequestUri.ParseQueryString()[ViewParameterName];
        if (!string.IsNullOrWhiteSpace(viewParameter))
            actionContext.ActionArguments[ActionParameterName] = viewParameter;

        base.OnActionExecuting(actionContext);
    }
}

And how to use it:

[BindParameter(ActionParameterName = "customData", ViewParameterName = "custom-data")]
public string Get(string customData) {}

Please note, that this only works if your data comes from the uri, not body. How to make it work with POST data, I'm not really sure of at the moment.

6 Comments

I set a breakpoint in the method and it does not seem to be breaking.
[ParameterName(ActionParameterName = "scale", ViewParameterName = "ms-scale")] [ParameterName(ActionParameterName = "contrast", ViewParameterName = "ms-contrast")] [ParameterName(ActionParameterName = "language", ViewParameterName = "ms-lang")] public HttpResponseMessage Get( int scale = 100, string contrast = "standard", string language = "en-us")
For Web API you should be using the System.Web.Http.Filters namespace. Are you using that namespace? I'll try and make an example.
If I use System.Web.Http.Filters.ActionFilterAttribute where does ActionExecutingContext come from? It keeps trying to reference System.Web.Mvc.ActionExecutingContext which is incorrect.
That does not seem to work if the parameter is an int. Works for String's though.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.