代码之家  ›  专栏  ›  技术社区  ›  Roman

如何在线程内生成ActionLink

  •  3
  • Roman  · 技术社区  · 14 年前

    UrlHelper 分类并使用 Action

    我该怎么做?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Community CDub    7 年前

    您需要伪造HttpContextBase并将其传递给UrlHelper,您可以在没有HttpContext的线程中使用它。这里是一个粗略的想法,虽然您需要围绕它创建一个类,但是这是一个概念的快速证明,因为单元测试也没有HttpContext。

    [TestFixture]
    public class RouteTestClass
    {
        private UrlHelper helper;
    
        public RouteTestClass()
        {
            MvcApplication.RegisterRoutes(RouteTable.Routes); //You dont need to do this if its done in global.asax!
            var c = new RequestContext(new FakeContext(), new RouteData());
            helper = new UrlHelper(c, RouteTable.Routes);
        }
    
        [Test]
        public void TestGetHomeIndex()
        {
            var url = helper.Action("Index", "Home");
            Assert.AreEqual("/",url);
        }
    }
    
    public class FakeContext : HttpContextBase
    {
        public override HttpRequestBase Request { get { return new FakeRequest(); } }
        public override HttpResponseBase Response { get { return new FakeResponse(); } }
    }
    
    public class FakeRequest : HttpRequestBase
    {
        public override string ApplicationPath { get { return "/"; } }
        public override NameValueCollection ServerVariables { get { return new NameValueCollection(); } }
    }
    
    public class FakeResponse : HttpResponseBase
    {
        public override string ApplyAppPathModifier(string virtualPath)
        {
            return virtualPath;
        }
    }
    

    编辑

    this

    [TestFixture]
    public class RouteTestClass
    {
        private UrlHelper helper;
    
        public RouteTestClass()
        {
            MvcApplication.RegisterRoutes(RouteTable.Routes);
            var req = new HttpRequest("/", "http://www.yoururl.com", "");
            var resp = new HttpResponse(new StringWriter());
            var httpContext = new HttpContext(req, resp);
            var c = new RequestContext(new HttpContextWrapper(httpContext), new RouteData());
            helper = new UrlHelper(c, RouteTable.Routes);
        }
    
        [Test]
        public void TestGetHomeIndex()
        {
            var url = helper.Action("Index", "Home");
            Assert.AreEqual("/",url);
        }
    }
    
        2
  •  0
  •   bzlm    14 年前

    您可以授予线程对现有 UrlHelper URL帮助程序 Url 属性:

    new Thread(
        urlHelper =>
        {
            var url = 
                ((UrlHelper)urlHelper)
                .Action("Index", "Home", new { Id = 5 });
            // use url here
        }
    ).Start(Url);