27

ASP.NET MVC を学ぶために、基本的な問題管理システムに取り組んでいます。私はそれを立ち上げてかなりまともなレベルまで実行しましたが、問題に遭遇しました.

Openというビューを持つIssueという名前のコントローラーがあります。/Issue/Open には、現在システムに記録されている未解決の問題がすべて一覧表示されます。次のようにルートを定義しました。

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

これは、IssueController.cs で次のコードを使用して、これまでのところ正常に機能しています。

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

これは問題なく動作しています (ただし、クエリの定義を処理するためのスイッチよりも優れた方法があるのではないかと思います) が、[未解決の問題] ビューで次の 2 つのことを実行できるようにしたいと考えています。

  1. 任意の見出しで並べ替え - OK
  2. 特定の見出し (技術者、顧客、カテゴリ、優先度、ステータス) でフィルター処理する - ??

クエリを整理できるように、コントローラーに 2 つのパラメーターを渡す方法がわかりません。また、その場でクエリを生成する方法を理解しない限り、スイッチに (並べ替えオプションの数) * (フィルター オプションの数) が必要になることにも気付きました。

ああ、誰かが私を正しい方向に向けることができますか? 乾杯!

4

5 に答える 5

33
  1. ルートから並べ替えを削除します。パラメータなしでルートを使用するだけです。
  2. 並べ替え、フィルターなどのクエリにクエリ文字列パラメーターを追加します。したがって、クエリは次のようになります。

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

public ActionResult Open(string sort, string filter)

MVC フレームワークは、クエリ文字列パラメーターから引数を入力します。入力されない可能性があるこれらのクエリ文字列パラメーター引数には、必ず null 許容型 (文字列など) を使用してください。

実際、これは URL を記述する「より正しい」方法だと思います。URL 自体がリソース (未解決の問題) を識別します。クエリ文字列パラメーターは、リソースの表示方法をカスタマイズします。

クエリの数に関しては、クエリ全体を一度に作成する必要はないことに注意してください。.OrderBy 拡張メソッドを使用して、既存の IQueryable<T> を並べ替えることができます。.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);
}     
于 2009-01-28T15:47:09.023 に答える
10

任意の数のパラメーターが必要な場合は、次のようにすることができます。


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


于 2009-01-29T03:17:48.050 に答える
8

これはキムスクの回答へのコメントである必要がありますが、何らかの理由でコメントするには精査する必要があるため、間違った場所に投稿する必要があります。

任意の数のクエリ文字列パラメーターを処理するより良い方法は、次のActionFilterようなものを使用することです。

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

アクションに an 属性を追加する[QueryStringFilter("attributes")]と、クエリ文字列の値が として渡されますFormCollectionRequestこのようにして、シングルトンに依存しなくなるため、アクションをより簡単にテストできます。

于 2009-06-18T16:55:03.417 に答える
1

スイッチの代わりに、Dynamic Linq を使用して、次のように言うことができます。

Issues = Issues.OrderBy("Status");

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

于 2012-03-28T11:46:56.947 に答える
0

すべてのプロセスについて説明している以下の投稿を確認して ください http://www.c-sharpcorner.com/UploadFile/4b0136/editing-multiple-records-using-model-binding-in-mvc/

于 2015-11-09T10:36:49.767 に答える