How do I route a URL with a querystring in ASP.NET MVC?

前端 未结 4 1729
有刺的猬
有刺的猬 2020-11-28 15:28

I\'m trying to setup a custom route in MVC to take a URL from another system in the following format:

../ABC/ABC01?Key=123&Group=456

The 01

4条回答
  •  误落风尘
    2020-11-28 16:04

    The query string arguments generally are specific of that controller and of that specific application logic.

    So it will better if this isn't written in route rules, that are general.

    You can embed detection of query string on action argument in the following way.

    I think that is better to have one Controller for handling StepNo.

    public class ABC : Controller
    {
        public ActionResult OpenCase(OpenCaseArguments arg)
        {
            // do stuff here
            // use arg.StepNo, arg.Key and arg.Group as You need
            return View();
        }        
    }
    
    public class OpenCaseArguments
    {
        private string _id;
        public string id
        {
            get
            {
                return _id;
            }
    
            set
            {
                _id = value; // keep original value;
                ParseQueryString(value);
            }
        }
    
        public string  StepNo { get; set; }
        public string Key { get; set; }
        public string Group { get; set; }
    
        private void ParseQueryString(string qs)
        {
            var n = qs.IndexOf('?');
            if (n < 0) return;
            StepNo = qs.Substring(0, n); // extract the first part eg. {stepNo}
            NameValueCollection parms = HttpUtility.ParseQueryString(qs.Substring(n + 1));
            if (parms.Get("Key") != null) Key = parms.Get("Key");
            if (parms.Get("Group") != null) Group = parms.Get("Group");
        }
    
    }
    

    ModelBinder assign {id} value to the id field of OpenCaseArguments. The set method handle querystring split logic.

    And keep routing this way. Note routing get your querystring in id argument.

    routes.MapRoute(
        "OpenCase", 
        "ABC/OpenCase/{id}",
        new {controller = "ABC", action = "OpenCase"}
    );
    

    I have used this method for getting multiple fields key value on controller action.

提交回复
热议问题