2016-12-08 13 views
0

私は、コントローラのアクションメソッドにURLからパラメータとしてデータを送る方法を知っています。ここで私はどのようにURLからコントローラのフィールドにデータを送ることができますか?URLからコントローラのフィールドにデータを渡す方法は?

public MyAwesomeController : Controller { 
    public string SectionCode { get;set; } 
} 

とのルートを定義してみましょう:

routes.MapRoute(
      name : "AwesomeRouter", 
      url : "{code}/{action}", 
      defaults: new {controller = "MyAwesome", action = "Index", /* What to do here?*/} 
     ); 

私はSectionCodeはURLから{}のコードで満たされたいです。実装することは可能ですか?

+2

これは動作しません。ルーティングとは、URLを取り出し、適切な*メソッド*と照合して呼び出すことを意味します。 'sectionCode'をアクションのパラメータとして宣言し、それを' SectionCode'プロパティに代入することができます。コントローラーのファクトリーまたは呼び出し側をカスタマイズして目標を達成することはできますが、その努力やリスクに値するとは思えません。 – haim770

+1

これは動作しません。ルーティングはURLと特定のアクションを一致させます。ただし、コントローラのカスタム属性を作成し、そのパラメータを検索してプロパティを設定することもできます。しかしそれはあまり優雅でも効率的でもありません。 –

+3

このようなコントローラのプロパティを持つのは悪い設計です。コントローラはリクエストのライフサイクルを持ちます(リクエストごとにインスタンス化され、処理されます)ので、コントローラにプロパティを設定することはとにかく意味がありません。アクションは、アクション内で起こっていることに必要なコンテキスト(この場合は 'code'値など)を受け入れる必要があります。ちょうどアクションパラメータとしてそれを受け入れて、それを1日と呼んでください。 –

答えて

1

はい、基本的なControllerクラスから継承したクラスを作成し、URL、ルート、フォームデータを読み込んでセッションに格納するか、必要なフィールドに直接入力できるOnActionExecutingメソッドをオーバーライドできます。次に、コントローラの継承クラスを作成します。

public class MyAwesomeController : MyControllerBase 
{ 
    public ActionResult Index() 
    { 
     //this.SectionCode is available populated here 
     return View(); 
    } 
} 

public class MyControllerBase : Controller 
{ 
    public string SectionCode 
    { 
     get; 
     private set; 
    } 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     this.SectionCode = filterContext.RequestContext.RouteData.Values["code"].ToString(); 
     base.OnActionExecuting(filterContext); 
    } 
} 

指定したルート定義を使用してこのコントローラでアクションを実行するたびに、フィールドに自動的に入力されます。しかし、複数のルートが定義されていると、それは容易に衝突に陥る可能性があります。コードが任意のコントローラ名と一致するとき。通常のウェブサイトはこのようには動作しません。

0

あなたのルートは、次のようになります。

routes.MapRoute(
     name: "AwesomeRouter", 
     url: "{code}/{action}", 
     defaults: new { controller = "MyAwesome", action = "Index" } 
    ); 

コードは、パラメータとしてアクションに渡されるべきです。私は、説明のためのビュー袋に入れて保管しています:

public class MyAwesomeController : Controller 
{ 

    public ActionResult Index(string code) 
    { 
     ViewBag.Code = code; 
     return View(); 
    } 
} 

は、このURLを使用する:

@ViewBag.Code 

あなたがすべき:あなたはあなたのビューでViewbagプロパティにアクセスする場合

http://somehost/4567/Index 

参照:

4567