Как установить свойство System.Web.WebPages.WebPage.Model - PullRequest
0 голосов
/ 27 мая 2011

Я планирую создать собственный маршрут с использованием веб-страниц ASP.NET путем динамического создания экземпляров WebPage следующим образом:

IHttpHandler handler = System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath("~/Default.cshtml");

Как я могу предоставить объект базовому WebPage объекту, чтобы он мог стать "моделью" веб-страниц? Другими словами, я хочу иметь возможность записать @Model.Firstname в файл Default.cshtml.

Любая помощь будет принята с благодарностью.

UPDATE

Изменив ответ @Pranav, я смог получить базовый WebPage объект, используя отражение:

    public void ProcessRequest(HttpContext context)
    {
        //var page = (WebPage) System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath(this.virtualPath);

        var handler = System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath(this.virtualPath);
        var field = handler.GetType().GetField("_webPage", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var page = field.GetValue(handler) as System.Web.WebPages.WebPage;

        var contextWrapper = new HttpContextWrapper(context);
        var pageContext = new WebPageContext(contextWrapper, page, context.Items[CURRENT_NODE]);

        page.ExecutePageHierarchy(pageContext, contextWrapper.Response.Output);
    }

К сожалению, это ненадежно, так как не работает в Medium Trust (BindingFlags.NonPublic игнорируется, если приложение не работает с полным доверием). Поэтому, хотя мы добились значительного прогресса, решение еще не завершено.

Любые предложения будут с благодарностью.

1 Ответ

2 голосов
/ 20 июня 2011

Свойство Model веб-страницы получено из WebPageContext. Чтобы установить модель, вы можете создать WebPageContext с правильными параметрами: -

var page = (WebPage)WebPageHttpHandler.CreateFromVirtualPath("~/Default.cshtml");
var httpContext = new HttpContextWrapper(HttContext.Current);
var model = new { FirstName = "Foo", LastName = "Bar" };
var pageContext = new WebPageContext(httpContext, page, model);

page.ExecutePageHierarchy(pageContext, httpContext.Response.Output);

Экземпляр модели теперь должен быть доступен на вашей странице в виде динамического типа.

...