wake-up-neo.com

Übergeben mehrerer Parameter an den Controller in ASP.NET MVC; auch das Erzeugen von fliegenden Abfragen in LINQ-to-SQL

Ich arbeite an einem einfachen Issue Management System, um ASP.NET MVC zu erlernen. Ich habe es auf ein ziemlich anständiges Niveau gebracht, aber ich bin auf ein Problem gestoßen.

Ich habe einen Controller namens Issue mit einer Ansicht namens Open./Problem/Öffnen listet alle offenen Probleme auf, die aktuell im System protokolliert sind. Ich habe eine Route so definiert:

    routes.MapRoute( 
        "OpenSort",                                                         // Route name
        "Issue/Open/{sort}",                                                // URL with parameters
        new { controller = "Issue", action = "Open", sort = "TimeLogged" }  // Parameter defaults
    );

Das funktioniert soweit gut, indem Sie den folgenden Code in IssueController.cs verwenden:

public ActionResult Open(string sort)
{            
    var Issues = from i in db.Issues where i.Status == "Open" orderby i.TimeLogged ascending select i;

    switch (sort)
    {
        case "ID":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.ID ascending select i;
            break;

        case "TimeLogged":
            goto default;

        case "Technician":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.Technician ascending select i;
            break;

        case "Customer":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.Customer ascending select i;
            break;

        case "Category":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.Category ascending select i;
            break;

        case "Priority":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.Priority ascending select i;
            break;

        case "Status":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.Status ascending select i;
            break;

        default:
            break;
    }            

    ViewData["Title"] = "Open Issues";
    ViewData["SortID"] = sort.ToString();

    return View(Issues.ToList());
}

Das funktioniert einwandfrei (obwohl ich frage mich, ob es einen besseren Weg gibt, meine Definition der Abfrage zu handhaben als ein Schalter?), Aber jetzt möchte ich zwei Dinge in der Ansicht "Offene Probleme" tun können:

  1. Sortieren Sie nach einer der Überschriften - OK
  2. Nach bestimmten Überschriften filtern (Techniker, Kunde, Kategorie, Priorität, Status) - ??

Ich kann nicht herausfinden, wie ich zwei Parameter an den Controller übergeben kann, damit ich meine Abfragen organisieren kann. Ich habe auch gerade begriffen, dass ich, wenn ich nicht raus finde, wie ich meine Anfragen schnell generieren kann, (Anzahl der Sortieroptionen) * (Anzahl der Filteroptionen) in meinem Switch brauchen wird.

Argh, kann mich jemand in die richtige Richtung weisen? Prost!

27
Rob Burke
  1. Sortierung von der Route entfernen. Verwenden Sie einfach eine Route ohne Parameter.
  2. Fügen Sie der Abfrage Abfragezeichenfolgeparameter für Sortierung, Filter usw. hinzu. Ihre Abfrage sieht dann folgendermaßen aus:

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

public ActionResult Open(string sort, string filter)

Das MVC-Framework füllt die Argumente aus den Abfragezeichenfolge-Parametern aus. Stellen Sie sicher, und verwenden Sie nullfähige Typen (wie Zeichenfolge) für diese Abfrageparameterparameter, die möglicherweise nicht ausgefüllt sind.

Ich denke eigentlich, dass dies eine "richtigere" Art ist, die URL zu schreiben. Die URL selbst identifiziert die Ressource (offene Probleme). Die Parameter für die Abfragezeichenfolge passen die Anzeige der Ressource an.

Bedenken Sie bei der Anzahl der Abfragen, dass Sie nicht die gesamte Abfrage auf einmal erstellen müssen. Sie können die Erweiterungsmethode .OrderBy verwenden, um eine vorhandene IQueryable <T> -Anordnung neu zu ordnen.

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);
}     
33
Craig Stuntz

Wenn Sie eine beliebige Anzahl von Parametern erwarten, können Sie so etwas tun.


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"];
   ...


10
kimsk

Dies sollte ein Kommentar zu kimsks Antwort sein, aber aus irgendeinem Grund erfordert das Kommentieren, dass ich überprüft werde, also muss ich es an der falschen Stelle posten.

Eine bessere Möglichkeit, mit einer beliebigen Anzahl von Abfragezeichenfolge-Parametern zu arbeiten, ist die Verwendung einer ActionFilter wie folgt:

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);
    }
}

Jetzt können Sie der Aktion ein Attribut wie [QueryStringFilter("attributes")] hinzufügen, und die Abfragezeichenfolgenwerte werden als FormCollection übergeben. Auf diese Weise lässt sich Ihre Aktion leichter testen, da sie nicht mehr vom Singlet Request abhängt.

8
ungood

Anstelle des Schalters können Sie Dynamic Linq verwenden, mit dem Sie Folgendes sagen können:

Issues = Issues.OrderBy("Status");

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

1
gurra777

Bitte überprüfen Sie den Beitrag unten, der alle Prozesse beschreibt http://www.c-sharpcorner.com/UploadFile/4b0136/editing-multiple-records-using-model-binding-in-mvc/

0
Valynk