获取局部视图';从控制器内部删除HTML

获取局部视图';从控制器内部删除HTML,html,asp.net-mvc,viewusercontrol,Html,Asp.net Mvc,Viewusercontrol,我为我的mvc网站开发了一种简单的机制,通过jquery导入html,然后填充指定的div。一切都很好,看起来很酷。 我的问题是,我现在正在我的控制器内创建html标记(这在VB.net中非常容易做到),我不希望混淆关注点的分离 是否可以使用自定义的“MVC视图用户控件”来满足此需求?我是否可以创建控件的实例,传入模型数据并呈现为html?然后,只需渲染并传递回调用浏览器即可。在rails中,这称为渲染局部视图,您可以使用render:partial=>“yourfilename”来完成。我相信

我为我的mvc网站开发了一种简单的机制,通过jquery导入html,然后填充指定的div。一切都很好,看起来很酷。
我的问题是,我现在正在我的控制器内创建html标记(这在VB.net中非常容易做到),我不希望混淆关注点的分离


是否可以使用自定义的“MVC视图用户控件”来满足此需求?我是否可以创建控件的实例,传入模型数据并呈现为html?然后,只需渲染并传递回调用浏览器即可。

在rails中,这称为渲染局部视图,您可以使用
render:partial=>“yourfilename”
来完成。我相信ASP.NET MVC有一个类似的
RenderPartial
方法,但我找不到MVC的官方文档来证实或否认这样的事情。

在谷歌上深入挖掘之后,我找到了答案。 您无法轻松访问视图输出的html


您可以创建如下操作:

        public PartialViewResult LoginForm()
        {
            var model = // get model data from somewhere
            return PartialView(model);
        }
$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});
<script type="text/javascript">
    $.ajaxSetup({ cache: false });

    $(document).ready(function () {
        $('div.onload').each(function () {
            var source = $(this).html();
            if (source != "") {
                $(this).load(source);
            }
        });
    });
</script>
public PartialViewResult yourpartialviewresult()
{
    var yourModel
    return PartialView("yourPartialView", yourModel);
}
该操作将把呈现的部分视图返回到jquery响应

您的jquery可能如下所示:

        public PartialViewResult LoginForm()
        {
            var model = // get model data from somewhere
            return PartialView(model);
        }
$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});
<script type="text/javascript">
    $.ajaxSetup({ cache: false });

    $(document).ready(function () {
        $('div.onload').each(function () {
            var source = $(this).html();
            if (source != "") {
                $(this).load(source);
            }
        });
    });
</script>
public PartialViewResult yourpartialviewresult()
{
    var yourModel
    return PartialView("yourPartialView", yourModel);
}

您应该使用jquery来填充div(并在需要时创建新的html元素),以及ActionResult的Json序列化

另一种方法是使用jquery调用一些控制器/操作,但json使用常规视图(aspx或ascx、webforms视图引擎)来呈现内容,使用jquery只需将html注入某些div。这是从asp.net ajax更新窗格的一半

我可能会使用第一种方法,使用json,在这里您没有更多的工作要做,但它更“优化”,因为您不需要通过网络传输整个html,只需要序列化对象。这是“大人物”(gmail、g文档、hotmail等等)的方式——大量的JS代码通过UI进行操作

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

  • html.renderpartial(“ascx的名称”)
  • 来自Microsoft.web.mvc(mvc futures)的html.RenderAction(x=>x.ActionName)

我构建了一个粗略的框架,允许您在MVC Beta版中从控制器方法将视图渲染为字符串。这将有助于解决目前的这一限制

此外,我还为MVC测试版构建了一个类似RJSJavaScript的Rails生成框架


请访问查看,并告诉我您的想法。

您有几种选择

在控制器中为视图创建MVC视图用户控件和操作处理程序。要渲染视图,请使用

<% Html.RenderPartial("MyControl") %>
另一个选项是从父页面传递模型数据。在这种情况下,您不需要操作处理程序,并且模型类型与父级相同:

<% Html.RenderPartial("MyControl", ViewData.Model) %>

如果用户控件有自己的数据类型,也可以在页面中构造它

在MyControl.ascx.cs中:

public class MyControlViewData
{
    public string Name { get; set; }
    public string Email { get; set; }
}

public partial class MyControl : System.Web.Mvc.ViewUserControl <MyControlViewData>
{
}
公共类MyControlViewData
{
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
}
公共部分类MyControl:System.Web.Mvc.ViewUserControl
{
}
在页面中,您可以初始化控件的数据模型:

<% Html.RenderPartial("MyControl", new MyControlViewData ()
   {
        Name= ViewData.Model.FirstName,
        Email = ViewData.Model.Email,
   });
 %>

这是一个使用ASP.Net MVC 1.0的解决方案(许多声称使用beta 3但不使用1.0),不存在“发送HTTP头后服务器无法设置内容类型”问题,并且可以从控制器内调用(而不仅仅是视图):


我为正在开发的应用程序做了类似的事情。我有返回渲染内容的局部视图,可以使用它们的REST路径或使用:

<% Html.RenderAction("Action", "Controller"); %>

然后在我的实际显示HTML中有一个DIV,它由jQuery填充:

<div class="onload">/controller/action</div>
/controller/action
jQuery如下所示:

        public PartialViewResult LoginForm()
        {
            var model = // get model data from somewhere
            return PartialView(model);
        }
$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});
<script type="text/javascript">
    $.ajaxSetup({ cache: false });

    $(document).ready(function () {
        $('div.onload').each(function () {
            var source = $(this).html();
            if (source != "") {
                $(this).load(source);
            }
        });
    });
</script>
public PartialViewResult yourpartialviewresult()
{
    var yourModel
    return PartialView("yourPartialView", yourModel);
}

$.ajaxSetup({cache:false});
$(文档).ready(函数(){
$('div.onload')。每个(函数(){
var source=$(this.html();
如果(源!=“”){
$(此).load(源);
}
});
});
这将扫描与“onload”类匹配的所有DIV,并从其内容中读取REST路径。然后在该REST路径上执行jQuery.load,并用结果填充DIV


对不起,我得赶我回家的车。如果您想让我详细说明,请告诉我。

非常简单,您只需创建一个强类型的局部视图(或用户控件),然后在您的合作伙伴中执行以下操作:

        public PartialViewResult LoginForm()
        {
            var model = // get model data from somewhere
            return PartialView(model);
        }
$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});
<script type="text/javascript">
    $.ajaxSetup({ cache: false });

    $(document).ready(function () {
        $('div.onload').each(function () {
            var source = $(this).html();
            if (source != "") {
                $(this).load(source);
            }
        });
    });
</script>
public PartialViewResult yourpartialviewresult()
{
    var yourModel
    return PartialView("yourPartialView", yourModel);
}
然后,您可以在需要时使用JQuery执行请求:

$.ajax({
    type: 'GET',
    url: '/home/yourpartialviewresult',
    dataType: 'html', //be sure to use html dataType
    contentType: 'application/json; charset=utf-8',
    success: function(data){
         $(container).html(data);
    },
    complete: function(){ }
 });    

我发现这一行代码工作得很好。orderModel是我的模型对象。在我的例子中,我有一个helper方法,其中我必须合并部分视图的html

System.Web.Mvc.Html.PartialExtensions.Partial(html, "~/Views/Orders/OrdersPartialView.cshtml", orderModel).ToString();

我一直在谷歌上搜索这个问题;自MVC进入测试版以来,似乎有一些方法被破坏/删除。仍然在寻找答案,在控制器中创建HTML标记不是混淆了关注点的分离吗?如果需要重复执行某些操作,请查看使用ascx控件?视图是否应该关注生成HTML?为什么标记在控制器中?我只是需要同样的功能。在我的Json对象中返回渲染部分。此链接对methis很有用。您是否可以通过编程方式访问视图/部分生成的HTML?我不明白这是怎么回答这个问题的。。。虽然我确实从答案中学到了一些东西,但我很感激这是一个高质量的回答。这个回答并没有回答问题。如何从控制器内部获取部分视图的HTML?您是否希望在将HTML发送回浏览器之前捕获/修改该HTML?当它没有回答问题时,为什么这是公认的答案?这仍然是任何主要MVC项目经常需要的东西。因此,感谢您提供的方法这似乎对我不起作用,因为我的部分使用了填充到Url属性中的UrlHelper类