2011-06-09 125 views
51

如何为局部视图创建单独的控制器和模型?我希望能够将该部分视图放置在网站的任何位置,以便它需要它自己的控制器。我目前的渲染部分作为这样在ASP.NET MVC中为局部视图创建控制器

@Html.Partial("_Testimonials") 
+0

http://www.c-sharpcorner.com/article/html-action-and-html-renderaction-in-Asp-Net-mvc/ – 2017-08-28 07:41:35

回答

93

为什么不使用Html.RenderAction()

然后,你可以把下列任何控制器(甚至为它创建一个新的控制器):

[ChildActionOnly] 
public ActionResult MyActionThatGeneratesAPartial(string parameter1) 
{ 
    var model = repository.GetThingByParameter(parameter1); 
    var partialViewModel = new PartialViewModel(model); 
    return PartialView(partialViewModel); 
} 

然后,你可以创建一个新的局部视图,有你的PartialViewModel是它从继承。

剃刀,在视图中的代码块应该是这样的:

@{ Html.RenderAction("Index", "Home"); } 

对于WebFormsViewEngine,它应该是这样的:

<% Html.RenderAction("Index", "Home"); %> 
+3

renderaction的唯一功能是当然,它使第二个请求,而renderpartial做它作为相同的初始请求的一部分。 9/10次无所谓但值得注意。请参阅http://stackoverflow.com/questions/719027/renderaction-renderpartial获取一点背景 – 2011-06-09 08:19:08

+0

在vbhtml中,我在@ Html.RenderAction(“MyActionThatGeneratesAPartial”,“Home”)上收到错误“Expression does not produce a value” ' – KyleMit 2014-10-29 23:17:26

+0

@kylemit是你的代码吗? '@ {Html.RenderAction(“Index”,“Home”); }' – 2014-10-29 23:18:54

8

如果是我,我会简单地创建一个动作一个新的控制器,然后代替部分使用的RenderAction:

// Assuming the controller is named NewController 
@{Html.RenderAction("ActionName", 
        "New", 
         new { routeValueOne = "SomeValue" }); 
} 
+3

在您的代码段岂不是更好正如你在答案中所描述的那样使用'RenderAction'? – Martin 2014-11-14 13:04:21

+0

不得不说这是我迄今为止发现的唯一例子,其中部分封装了自己的功能,因此我可以在任何地方放置一行代码,并使其无需对其他视图/控制器等进行修改。 – djack109 2017-06-20 07:14:04

8

它并不需要它自己的控制器。你可以使用

@Html.Partial("../ControllerName/_Testimonials.cshtml") 

这允许你从任何页面渲染部分。只要确保相对路径是正确的。

+4

为什么会被拒绝?假设是需要一个单独的控制器来在网站的任何页面上呈现部分内容。这不是真的。你可以从任何控制器渲染一个局部。这是一个有效的答案 – Slick86 2011-06-09 01:30:54

+2

只是猜测,无论谁低估你可能想要一个视图模型去部分视图,并将其创建到一个单独的专用控制器。您的示例在没有viewmodel的情况下效果很好,但强制当前(全部)控制器创建/填充视图模型并将其传递给局部 – 2014-01-07 13:39:40

+0

不要忘记扩展名:Html.Partial(“../ControllerName/_Testimonials.cshtml“) – JoshYates1980 2014-09-04 19:43:29

2

最重要的是,创建的动作必须返回部分视图,请参见下文。

public ActionResult _YourPartialViewSection() 
{ 
    return PartialView(); 
} 
相关问题