2011-02-16 86 views
4

我有一个局部视图,我想通用。根据this question,部分视图不能是通用的。所以我反而做了一个HtmlHelper扩展,它处理我想要的类型安全的部分,然后将其余的部分交给真正的局部视图。ASP.NET MVC通用局部视图模式

通常我的助手是在页面加载时调用的,它工作正常,但有时我想通过AJAX添加一行或其他东西。发生这种情况时,控制器无法使用我的“局部视图”,因为它无法访问HtmlHelper。

除了用object类型的模型进行局部视图外,有什么我可以做的吗?

我使用剃刀,如果这很重要。

的我在做什么的简化版本:

public static MvcHtmlString DoStuff<T>(this HtmlHelper html, IEnumerable<T> data, 
    Func<T, ViewModelType> StronglyTypedFn, string PartialName) 
    { 
    // the pre- and post-processing for the partial view is complex enough I'd like 
    // to encapsulate it. But I want the encapsulation to include the safety 
    // benefits that generics give. 
    var mappedData = data.Select(StronglyTypedFn); 
    string htmlData = ""; 
    foreach(var model in mappedData){ 
    htmlData += html.Partial(PartialName, model); 
    } 
    htmlData += "some boilerplate footer html"; 
    return htmlData; 
} 

我意识到,在这个例子中,我有,它似乎毫无意义的具有助手的局部视图之外的代码,这样几行,但在我真实的例子是比较复杂的。

现在,在ajax调用中,我想返回Html.DoStuff()。但我不能,因为这需要访问HtmlHelper,并且帮助程序在控制器内不可用。

+0

我不完全了解您的情况。你能否展示这位助手是怎样的以及你如何从你的视线中调用它? – 2011-02-16 18:15:05

+0

@Darin:我添加了一个例子。可能有更好的方法来完成这与我如何完成它无关。 – Xodarap 2011-02-16 18:25:43

回答

0

你可以只是调用部分为一个模型实例

public PartialViewResult Single(string partialName) { 
    return PartialView(partialName); 
} 
0

你可以使用一个动态类型,而不是对象视图的一个简单的操作方法。

但是...似乎在这里有一些误解,因为控制器根本不应该尝试渲染视图。你能发布控制器代码吗?

更好的选择是IMO为您的ajax请求返回一个JsonResult,并在客户端使用JS添加行/行。