我已经为我的mvc网站开发了一个简单的机制,通过jquery插入html,然后填充指定的div。一切都很好,看起来很酷。
我的问题是,我现在在我的控制器内部创建html标记(这在VB.net btw中很容易做到)我宁愿不要混淆关注的问题。从控制器内部获取部分视图的HTML
是否可以使用自定义的“MVC查看用户控件”来满足此需求?我可以创建一个控件的实例,传入模型数据并呈现给html吗?这将是一个简单的事情,呈现并传递给调用浏览器。
我已经为我的mvc网站开发了一个简单的机制,通过jquery插入html,然后填充指定的div。一切都很好,看起来很酷。
我的问题是,我现在在我的控制器内部创建html标记(这在VB.net btw中很容易做到)我宁愿不要混淆关注的问题。从控制器内部获取部分视图的HTML
是否可以使用自定义的“MVC查看用户控件”来满足此需求?我可以创建一个控件的实例,传入模型数据并呈现给html吗?这将是一个简单的事情,呈现并传递给调用浏览器。
你有几个选择。
在您的控制器中为视图创建一个MVC View用户控件和操作处理程序。渲染视图使用
<% Html.RenderPartial("MyControl") %>
在这种情况下,您的操作处理程序将需要的模型数据传递给视图
public ActionResult MyControl()
{
// get modelData
render View (modelData);
}
你的另一个选择是从父页面传递模型数据。在这种情况下你不需要一个行动处理器和示范类型是一样的父:
<% 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>
{
}
而在你的页面,您可以初始化控件的数据模型:
<% Html.RenderPartial("MyControl", new MyControlViewData()
{
Name= ViewData.Model.FirstName,
Email = ViewData.Model.Email,
});
%>
在rails中,这被称为渲染局部视图,并且你用render :partial => 'yourfilename'
来完成。我相信ASP.NET MVC有一个类似的RenderPartial
方法,但我找不到MVC的官方文档来确认或否认这样的事情。
我一直在Google上搜索这个问题;自从MVC进入测试版以来,似乎有一些方法已被破解/删除。仍然在寻找答案 – 2008-11-13 03:55:44
经过在谷歌挖掘我已经找到了答案。 您无法轻松访问该视图输出的html。
您可以创建你的操作是这样的:
public PartialViewResult LoginForm()
{
var model = // get model data from somewhere
return PartialView(model);
}
和动作将返回到您的jQuery的响应呈现局部视图。
你的jQuery的可能看起来是这样的:
$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});
你应该使用jQuery来填充您的div(并创造如果需要新的HTML元素)和JSON序列化的ActionResult。
另一种方法是使用jQuery调用一些控制器/动作,而是使用的JSON定期查看(ASPX或ASCX,WebForms的视图引擎)渲染的内容,并与jQuery的只是注入该HTML一些股利。这是从asp.net ajax到UpdatePanels的一半...我可能会用第一种方法,用json,在那里你有更多的工作要做,但它更“优化”,因为你不'通过线路传输整个html,只有序列化的对象。这就是“大个子”(gmail,g docs,hotmail,..)这样做的方式 - 大量的用户界面操作的JS代码。
如果你不需要阿贾克斯,那么你基本上调用局部视图的方法有两种:
在你建议的第一种方法中,你指的是使用部分视图吗? – 2010-05-06 17:15:00
不,没有View的渲染内容,至少没有在服务器端,只是返回给jQuery,然后需要执行渲染的Json对象:动态创建Divs,Spans,Tables ...并用它们的数据填充它们json ajax请求。 第二种方法在服务器上呈现整个HTML并将其返回给客户端。 – 2010-05-12 09:18:37
我放在一起粗略的框架,它允许您从MVC测试版中的控制器方法呈现视图的字符串。现在这应该有助于解决这个限制。
另外,我还为MVC Beta组装了一个Rails-like RJS javascript生成框架。
看看http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc,让我知道你在想什么。
这是一个与ASP.Net MVC 1.0(许多声称与beta 3协同工作,不能与1.0协同工作)的解决方案,不会遭受'HTTP头部发送之后服务器无法设置内容类型“的问题,可以从一个控制器内(不仅仅是一个视图)被称为:
/// <summary>
/// Render a view into a string. It's a hack, it may fail badly.
/// </summary>
/// <param name="name">Name of the view, that is, its path.</param>
/// <param name="data">Data to pass to the view, a model or something like that.</param>
/// <returns>A string with the (HTML of) view.</returns>
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);
我为我正在处理的应用程序做了类似的事情。我返回渲染的内容部分意见,可以使用他们的REST路径或使用被称为:
<% Html.RenderAction("Action", "Controller"); %>
然后在我的实际显示HTML我是从jQuery的填补了DIV:
<div class="onload">/controller/action</div>
jQuery的长相像这样:
<script type="text/javascript">
$.ajaxSetup({ cache: false });
$(document).ready(function() {
$('div.onload').each(function() {
var source = $(this).html();
if (source != "") {
$(this).load(source);
}
});
});
</script>
这种扫描匹配“的onload”级和读取其内容的REST路径,所有的DIV。然后在该REST路径上执行jQuery.load,并用结果填充DIV。
对不起,要赶上我的回家。让我知道你是否想让我详细说明一下。
它是非常简单,你只需要创建一个强类型的局部视图(或用户控件),然后在您的cotroller是这样的:
public PartialViewResult yourpartialviewresult()
{
var yourModel
return PartialView("yourPartialView", yourModel);
}
,那么你可以使用jQuery执行whener你想要的要求:
$.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是我的模型对象。在我的情况下,我有一个帮助器方法,我不得不合并部分视图的html。
System.Web.Mvc.Html.PartialExtensions.Partial(html, "~/Views/Orders/OrdersPartialView.cshtml", orderModel).ToString();
难道你不是通过在你的控制器中制作HTML标记来混淆关注的分离吗?如果你需要重复做一些事情看看使用ascx控制? – 2008-11-16 23:48:10
不应该关心生成HTML吗?为什么你的控制器中有你的标记? – 2010-01-22 17:33:31
http://2leggedspider.wordpress.com/2009/11/05/serializing-a-partialview-as-json-in-asp-net-mvc/我只是需要相同的功能。在我的Json对象中返回呈现的部分。这个链接对我来说是有用的 – Bcelik 2010-02-08 21:21:00