从WebForms渲染MVC视图

时间:2014-12-24 14:31:38

标签: c# asp.net asp.net-mvc asp.net-mvc-4 webforms

我正在使用Visual Studio 2013.我有一个现有的WebForms Web项目,我在Dave Paquette的这篇文章后添加了MVC - http://www.davepaquette.com/archive/2013/12/30/so-you-inherited-an-asp-net-web-forms-application.aspx

然而,从现有的aspx页面中添加的MVC区域渲染局部视图的最佳方法是什么?

我以为我可以在我的aspx页面上有一个div:

<div id="mvcPartial"></div>

然后进行类似下面的ajax调用:

  $.ajax({
            url: '/MVCArea/MyController/MyAction',
            type: 'GET',
            success: function (data) {
                $('#mvcPartial').html(data);
            },
            error: function (xhr) {
                alert("Failedto return view");
            }
        });

有没有更好的方法来获取在aspx页面中呈现的MVC视图?

2 个答案:

答案 0 :(得分:0)

javascript helper:

function getPartial(url,data,controlId)
{
    $.ajax({
        type: "GET",
        data: data,
        url: url,
        cache: false
        }).done(function (result) {
            $(controlId).html(result);
        }).fail(function (jqXHR, textStatus) {
            $(controlId).html("Request failed: " + textStatus);
        });
}

答案 1 :(得分:0)

您所做的可能是最简单,最安全的方法,因为它避免了在同一Web请求中尝试混合WebForms和MVC上下文。

缺点当然是您需要2个http请求才能获取页面内容。

如果您想将一个简单的MVC部分视图作为aspx页面本身的一部分呈现,而不需要单独的请求,您可以尝试以下方法。

1)在你的代码后面创建一个HtmlHelper实例。以下代码改编自Access HtmlHelpers from WebForm when using ASP.NET MVC

  protected HtmlHelper htmlHelper;

    protected void Page_Load(object sender, EventArgs e)
    {
        var httpContext = new HttpContextWrapper(HttpContext.Current);
        RouteData routeData = new RouteData();
        routeData.Values["controller"] = "Dummy";
        var controllerContext = new ControllerContext(httpContext, routeData, new DummyController());
        var viewContext = new ViewContext(controllerContext, new WebFormView(controllerContext, "View"), new ViewDataDictionary(), new TempDataDictionary(), TextWriter.Null);
        htmlHelper  = new HtmlHelper(viewContext, new ViewDataBag());                                   
    }


    private class ViewDataBag : IViewDataContainer
    {
        ViewDataDictionary viewData = new ViewDataDictionary();
        public ViewDataDictionary ViewData
        {
            get
            {
                return viewData;
            }
            set
            {
                viewData = value;
            }
        }
    }
    private class DummyController : Controller
    {
    }

请注意,此代码非常重要,当然感觉非常'hacky'。如果您经常使用它,可以将它放在基页或基本UserControl类中。

  1. 在.aspx文件中,您现在可以通过调用htmlHelper.Partial呈现部分视图:

    <div id="mvcPartial">
        <%:htmlHelper.Partial("_SimplePartial") %>
    </div>
    
  2. 我使用Web Forms 4.5和MVC 5进行了测试,它在简单的情况下工作。我无法确定它是否适用于所有情况。