2017-05-23 19 views
2

私はnetcoreapp1.1(aspnetcore 1.1.1)を使用しています。ASP.NETコントローラのプロパティを現在のURLの一部にバインドする方法はありますか

urlの一部をactionパラメータではなくcontrollerプロパティにバインドしたいと思いますか?

例: GET:https://www.myserver.com/somevalue/users/1

public class UsersController { 
    public string SomeProperty {get;set;} //receives "somevalue" here 

    public void Index(int id){ 
     //id = 1 
    } 
} 

答えて

1

これは、アクションフィルタで可能です:

[Route("{foo}/[controller]/{id?}")] 
[SegmentFilter] 
public class SegmentController : Controller 
{ 
    public string SomeProperty { get; set; } 

    public IActionResult Index(int id) 
    { 
    } 
} 

public class SegmentFilter : ActionFilterAttribute, IActionFilter 
{ 
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     //path is "/bar/segment/123" 
     string path = context.HttpContext.Request.Path.Value; 

     string[] segments = path.Split(new[]{"/"}, StringSplitOptions.RemoveEmptyEntries); 

     //todo: extract an interface containing SomeProperty 
     var controller = context.Controller as SegmentController; 

     //find the required segment in any way you like 
     controller.SomeProperty = segments.First(); 
    } 
} 

アクションIndexが実行される前に、次に要求パス"myserver.com/bar/segment/123""bar"SomePropertyを設定します。

関連する問題