当前位置:  开发笔记 > 编程语言 > 正文

从控制器内部获取部分视图的HTML

如何解决《从控制器内部获取部分视图的HTML》经验,为你挑选了4个好方法。

我为我的mvc网站开发了一个简单的机制,通过jquery引入html,然后填充指定的div.一切都很好,看起来很酷.
我的问题是我现在正在我的控制器内部创建html标记(这在VB.net中很容易做到btw)我宁可不要混淆一些关注点.

是否可以使用自定义的"MVC View用户控件"来满足这种需求?我可以创建控件的实例,传入模型数据并渲染为html吗?然后,这将是一个简单的渲染和传递回调用浏览器的问题.



1> pupeno..:

这是一个与ASP.Net MVC 1.0一起使用的解决方案(很多声称与beta 3一起使用的解决方案不能与1.0一起工作),不会受到"服务器无法在HTTP标头发送后设置内容类型"的问题并且可以从控制器(不仅是视图)中调用:

/// 
/// Render a view into a string. It's a hack, it may fail badly.
/// 
/// Name of the view, that is, its path.
/// Data to pass to the view, a model or something like that.
/// A string with the (HTML of) view.
public static string RenderPartialToString(string controlName, object viewData) {
    ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
    viewPage.Url = GetBogusUrlHelper();

    viewPage.ViewData = new ViewDataDictionary(viewData);
    viewPage.Controls.Add(viewPage.LoadControl(controlName));

    StringBuilder sb = new StringBuilder();
    using (StringWriter sw = new StringWriter(sb)) {
        using (HtmlTextWriter tw = new HtmlTextWriter(sw)) {
            viewPage.RenderControl(tw);
        }
    }

    return sb.ToString();
}

public static UrlHelper GetBogusUrlHelper() {
  var httpContext = HttpContext.Current;

  if (httpContext == null) {
    var request = new HttpRequest("/", Config.Url.ToString(), "");
    var response = new HttpResponse(new StringWriter());
    httpContext = new HttpContext(request, response);
  }

  var httpContextBase = new HttpContextWrapper(httpContext);
  var routeData = new RouteData();
  var requestContext = new RequestContext(httpContextBase, routeData);

  return new UrlHelper(requestContext);
}

这是一种静态方法,你可以放在一个方便的地方.你可以这样称呼它:

string view = RenderPartialToString("~/Views/Controller/AView.ascx", someModelObject); 



2> Kevin Zink..:

我整理了一个粗略的框架,它允许您从MVC Beta中的控制器方法向字符串渲染视图.这应该有助于解决这个限制.

此外,我还为MVC Beta组建了一个类似Rails的RJS javascript生成框架.

请访问http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc查看,并告诉我您的想法.



3> Christian Da..:

你会像这样创建你的动作:

        public PartialViewResult LoginForm()
        {
            var model = // get model data from somewhere
            return PartialView(model);
        }

并且该操作会将呈现的部分视图返回到您的jquery响应.

你的jquery看起来像这样:

$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});



4> Hrvoje Hudo..:

您应该使用jquery来填充div(如果需要,还可以创建新的html元素),以及ActionResult的Json序列化.

其他方法是使用jquery来调用一些控制器/动作,但是json使用常规View(aspx或ascx,webforms视图引擎)来呈现内容,而jquery只是将html注入到某个div中.这是来自asp.net ajax的UpdatePanels的一半...

我可能会选择第一种方法,使用json,你可以做更多的工作,但它更加"优化",因为你不会通过电线传输整个html,只有序列化的对象.这就是"大人物"(gmail,g docs,hotmail,..)这样做的方式 - 许多用UI操作的JS代码.

如果你不需要ajax,那么你基本上有两种方法来调用局部视图:

html.renderpartial("ascx名称")

来自Microsoft.web.mvc的html.RenderAction(x => x.ActionName)(mvc期货)

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有