ASP.Net MVC如何使用Html.RenderAction将url参数传递给ChildAction

JBe*_*ton 30 asp.net-mvc

我认为这将是直截了当的,但我设法把它搞砸了.如果我想将URL参数传递给另一个操作,我是否必须为此创建新路由?

调节器

[ChildActionOnly]
    public ActionResult ContentSection(string sectionAlias, string mvcController, string mvcAction = null)
Run Code Online (Sandbox Code Playgroud)

视图

@Html.RenderAction("ContentSection", "Portal", new {sectionAlias = "TermsAndConditions", mvcController = "Portal", mvcAction = "ChoosePayment"})
Run Code Online (Sandbox Code Playgroud)

错误

 CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments
Run Code Online (Sandbox Code Playgroud)

Nat*_*son 39

这里的问题是

@Html.RenderAction("ContentSection", "Portal", new {sectionAlias = "TermsAndConditions", mvcController = "Portal", mvcAction = "ChoosePayment"})
Run Code Online (Sandbox Code Playgroud)

相当于

<%= Html.RenderAction("ContentSection", "Portal", new {sectionAlias = "TermsAndConditions", mvcController = "Portal", mvcAction = "ChoosePayment"}) %>
Run Code Online (Sandbox Code Playgroud)

在Webforms ViewEngine(也是同一个Response.Write).RenderAction回归以来void,你不能Response.Write.你想要做的是:

@{
     Html.RenderAction("ContentSection", "Portal", new {sectionAlias = "TermsAndConditions", mvcController = "Portal", mvcAction = "ChoosePayment"});
 }
Run Code Online (Sandbox Code Playgroud)

@{ }语法表示在Razor视图发动机代码块,以下面的所述Web表单这将是等效ViewEngine:

<% Html.RenderAction("ContentSection", "Portal", new {sectionAlias = "TermsAndConditions", mvcController = "Portal", mvcAction = "ChoosePayment"}); %>
Run Code Online (Sandbox Code Playgroud)

  • 或者您可以调用@ Html.Action(...),以便将其称为返回内容的方法(如果您不喜欢使用花括号等) (10认同)

Oli*_*ver 12

简短的回答是:使用@ Html.Action().

@Html.Action("ContentSection", "Portal", new {sectionAlias = "Terms", ...})
Run Code Online (Sandbox Code Playgroud)

长的答案已经由Nathan安德森给出.

这个答案的PS Credit真的归于詹姆斯·奈尔(James Nail),后者在内森的回答中将其作为评论发表,但我发现它非常简单和有价值,我认为应该是个人答案.