我有一个部分观点,我想要是通用的。根据{{3}},部分视图不能是通用的。所以我做了一个HtmlHelper扩展,处理我想要类型安全的部分,然后将其余部分交给真正的局部视图。
通常我的助手在页面加载时被调用,这很好,但有时候我想通过AJAX添加一行或者其他东西。发生这种情况时,控制器无法使用我的“部分视图”,因为它无法访问HtmlHelper。
除了使用类型为object
的模型的部分视图外,还有什么我可以做的吗?
我正在使用Razor,如果这很重要的话。
我正在做的简化版本:
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 :(得分:0)
您可以使用一个简单的操作方法来调用一个模型实例的部分
public PartialViewResult Single(string partialName) {
return PartialView(partialName);
}
答案 1 :(得分:0)
您可以使用具有动态类型的视图而不是对象。
但是......似乎这里存在一些误解,因为Controller根本不应该尝试渲染视图。你能发布控制器代码吗?
更好的选择是,IMO,为您的ajax请求返回一个JsonResult,并使用JS在客户端添加行/。