Passing multiple parameters to controller in ASP.NET MVC; also, generating on-the-fly queries in LINQ-to-SQL

后端 未结 5 840
南方客
南方客 2020-12-08 01:05

I\'m working on a basic Issue Management System in order to learn ASP.NET MVC. I\'ve gotten it up and running to a fairly decent level but I\'ve run into a problem.

相关标签:
5条回答
  • 2020-12-08 01:42

    Please check the post below which describes all the processes http://www.c-sharpcorner.com/UploadFile/4b0136/editing-multiple-records-using-model-binding-in-mvc/

    0 讨论(0)
  • 2020-12-08 01:51

    This should be a comment to kimsks answer, but for some reason commenting requires me to be vetted, so I have to post it in the wrong place.

    A better way to handle an arbitrary number of query string parameters is to use an ActionFilter like so:

    public class QueryStringFilterAttribute : ActionFilterAttribute
    {
        public string ParameterName { get; private set; }
    
        public QueryStringFilterAttribute(string parameterName)
        {
            if(string.IsNullOrEmpty(parameterName))
                throw new ArgumentException("ParameterName is required.");
            ParameterName = parameterName;
        }
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var qs = new FormCollection(filterContext.HttpContext.Request.QueryString);
    
            filterContext.ActionParameters[ParameterName] = qs;
    
            base.OnActionExecuting(filterContext);
        }
    }
    

    Now you can add the an attribute to your action like so [QueryStringFilter("attributes")] and it will pass in the query string values as a FormCollection. This way your action is more easily tested, as it no longer depends on the Request singleton.

    0 讨论(0)
  • 2020-12-08 01:53

    If you expect arbitary number of parameters, you could do something like this.

    
    public ActionResult Open(){            
       string[] keys = Request.QueryString.AllKeys;
       Dictionary queryParams = new Dictionary();
       foreach (string key in keys)
       {
         queryParams[key] = Request.QueryString[key];
       }
       string sort = queryParams["sort"];
       ...
    
    
    
    0 讨论(0)
  • 2020-12-08 02:00
    1. Remove sort from the route. Just use a route without a parameter.
    2. Add query string parameters to the query for the sort, filter, etc. So your query will look like:

    http://example.com/Issue/Open?sort=ID&filter=foo

    public ActionResult Open(string sort, string filter)
    

    The MVC framework will fill in the arguments from the query string parameters. Make sure and use nullable types (like string) for any of these query string parameter arguments which might not be filled in.

    I actually think this is a "more correct" way to write the URL. The URL itself identifies the resource (open issues); the query string parameters customize how to display the resource.

    As far as the number of queries go, remember that you do not have to build the entire query at once. You can use the .OrderBy extension method to re-order an existing IQueryable<T>, and similarly with .Where.

    var Issues = from i in db.Issues where i.Status == "Open" select i;
    
    switch (sort)
    {
        case "ID":
            Issues = Issues.OrderBy(i => i.ID);
            break;
    
        // [...]
    
        default:
            Issues = Issues.OrderBy(i => i.TimeLogged);
    }     
    
    0 讨论(0)
  • 2020-12-08 02:03

    Instead of the switch, you could use Dynamic Linq which lets you say:

    Issues = Issues.OrderBy("Status");
    

    http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    0 讨论(0)
提交回复
热议问题