2

クエリ文字列の作成に問題があります。私はモデルを持っています:

[HttpGet]
 public partial class Task
    {
        public System.Guid UniqueID { get; set; }
        public string Description { get; set; }
        public decimal Priority { get; set; }
        public long TaskTypeId { get; set; }
        public TaskStatus TaskStatus { get; set; }
        public string GroupWorkspaceUrl { get; set; }
        public Nullable<System.DateTime> StartDate { get; set; }
        public Nullable<System.DateTime> Deadline { get; set; }
        public Nullable<int> PlannedHours { get; set; }
       {...}
    }

そして、コントローラーに2つのアクションがあります:

[HttpGet]
public virtual ActionResult TaskCreate(string schemaType)
        {
            var model = new Task();
            model.Accept(_taskService.ReaderVisitor, schemaType)
             {...}
        }
[HttpGet]
public virtual ActionResult TaskCreateWithModel(string schemaType, Task model)
        {
            SetDefaultValues(model);
            model.Accept(_taskService.ReaderVisitor, schemaType);
            {...}
       }

コントローラー (public virtual ActionResult TaskCreateWithModel(string schemaType, Task model)) で 2 番目のアクションを呼び出す他の C# WinForms ソリューションからクエリ文字列を作成したいのですが、クエリ文字列でタスク モデルを送信する方法がわかりません。 ? このクエリ文字列を呼び出そうとしましhttp://localhost:82/Task/TaskCreate?schemaType=default&Description=someDesciptionたが、常に最初のアクションが呼び出されます。Task モデルを使用してクエリ文字列を作成するにはどうすればよいですか?

4

4 に答える 4

2

このようなことを試すことができます (読みやすくするためにキャリッジ リターンを使用します)。数字と日付の形式はロケールに依存すると思います:

http://localhost:82/Task/TaskCreateWithModel?schemaType=default
                   &model.priority=3.2
                   &model.Description=hello
                   &model.GroupWorkspaceUrl=thisistheGroupWorkspaceUrl
于 2013-09-23T15:09:33.810 に答える
2

名前は明らかに QueryString です。渡すものはすべて文字列として解釈されます (サーバー側でボックス化解除できます)。シリアル化する場合を除き、複雑な型を QueryString で渡すことはできません。

あなたの場合、特に、呼び出す必要があります:

http://localhost:82/Task/TaskCreateWithModel?schemaType=default&Description=someDesciption

2 番目のアクションを呼び出すには。

于 2013-09-23T15:04:01.317 に答える
2

HTTP GET 操作を使用して新しいタスク リソースを作成することは非常にまれです。GET は冪等であると想定されています (つまり、同じリクエストを複数回行った場合、結果は 1 回行った場合とまったく同じです - 副作用はありません)。

また、作成操作に GET を使用すると、クロス サイト リクエスト フォージェリ (CSRF) が発生する可能性があります。これは、ASP.Net MVC の偽造防止保護が POST でのみ機能するためです。

作成操作は通常、HTTP POST (または PUT) であり、タスク オブジェクトのデータはクエリ文字列ではなく要求本文に含まれます。また、クエリ文字列を使用すると、使用できるデータの量が制限されます (URL の制限は 2000 文字ですか?)。

HTTP POST メソッドを使用すると、ASP.Net MVC の自動モデル バインディングによって、要求本文から正しい型付きオブジェクトが作成されるため、次のようなアクションを実行できます。

[HttpPost]
public virtual ActionResult TaskCreateWithModel(string schemaType, Task model)

必要に応じて、GET ではなく POST を使用し、クエリ文字列を使用しません。ここに MVC でのモデル バインディングの適切な説明があります。

http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx

于 2013-09-23T15:54:53.277 に答える