【问题标题】:Create controller for partial view in ASP.NET MVC在 ASP.NET MVC 中为局部视图创建控制器
【发布时间】:2011-09-11 08:03:04
【问题描述】:

如何为局部视图创建单独的控制器和模型?我希望能够将此部分视图放置在站点上的任何位置,因此它需要它自己的控制器。我目前正在渲染部分

@Html.Partial("_Testimonials")

【问题讨论】:

标签: asp.net asp.net-mvc partial-views


【解决方案1】:

为什么不使用Html.RenderAction()

然后您可以将以下内容放入任何控制器(甚至为它创建一个新控制器):

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

然后您可以创建一个新的局部视图并让您的 PartialViewModel 成为它的继承对象。

对于 Razor,视图中的代码块如下所示:

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

对于 WebFormsViewEngine,它看起来像这样:

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

【讨论】:

  • 唯一的 renderaction 当然是它发出第二个请求,而 renderpartial 将它作为同一个初始请求的一部分。 9/10 次无关紧要,但值得注意。请参阅stackoverflow.com/questions/719027/renderaction-renderpartial 了解一些背景
  • 在 vbhtml 中,@Html.RenderAction("MyActionThatGeneratesAPartial", "Home") 上出现错误“表达式不产生值”
  • @kylemit 你的代码是这样的吗? @{ Html.RenderAction("Index", "Home"); }
  • @GeorgeStocker,不。你说得对。诀窍是put it inside of a code block
  • 这对我来说是完美的解决方案。我正在使用 return PartialView() 来呈现包含 _Layout 视图中站点标题的下拉列表的部分视图,如下所示:PartialView("_AccountsDDL", model);
【解决方案2】:

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

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

这允许您从任何页面呈现部分内容。只要确保相对路径正确即可。

【讨论】:

  • 为什么会被否决?假设是需要一个单独的控制器才能在站点的任何页面上呈现部分。这不是真的。您可以从任何控制器渲染部分。这是一个有效的答案
  • 只是猜测,无论谁对你投了反对票,都可能希望视图模型与局部视图一起使用,并将其创建留给单独的专用控制器。您的示例在没有视图模型的情况下效果很好,但会强制当前(所有)控制器创建/填充视图模型并将其传递给部分
  • 别忘了扩展名:Html.Partial("../ControllerName/_Testimonials.cshtml")
【解决方案3】:

如果是我,我会简单地创建一个具有 Single Action 的新 Controller,然后使用 RenderAction 代替 Partial:

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

【讨论】:

  • 在您的代码 sn-p 中使用RenderAction 不是更好吗?正如您在回答中所描述的那样?
  • 不得不说这是迄今为止我发现的唯一一个例子,其中部分封装了它自己的功能,所以我可以在任何地方放置一行并让它在不修改其他视图/控制器等的情况下工作
【解决方案4】:

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

public ActionResult _YourPartialViewSection()
{
    return PartialView();
}

【讨论】:

    【解决方案5】:

    您不需要控制器,并且在使用 .Net 5 (MVC 6) 时,您可以异步渲染部分视图

    @await Html.PartialAsync("_LoginPartial")
    

    @{await Html.RenderPartialAsync("PartialName");}
    

    或者如果你使用 .net core 2.1 > 你可以use:

    <partial name="Shared/_ProductPartial.cshtml"
             for="Product" />
    

    【讨论】:

      【解决方案6】:

      Html.Action 是一种设计不佳的技术。 因为在您的页面控制器中,您无法在部分控制器中接收计算结果。数据流只有Page Controller => Partial Controller。

      要更接近 WebForm UserControl (*.ascx),您需要:

      1. 创建页面模型和部分模型

      2. 将部分模型作为属性放置在页面模型中

      3. 在页面的视图中使用 Html.EditorFor(m => m.MyPartialModel)
      4. 创建适当的局部视图
      5. 创建一个与这里多次回答中描述的子动作控制器非常相似的类。但它只是一个类(继承自 Object 而不是 Controller)。我们将其命名为 MyControllerPartial。 MyControllerPartial 将只知道部分模型。
      6. 在您的页面控制器中使用您的 MyControllerPartial。将 model.MyPartialModel 传递给 MyControllerPartial
      7. 注意 MyControllerPartial 中的正确前缀。 Fox 示例:ModelState.AddError("MyPartialModel." + "SomeFieldName", "Error")
      8. 在 MyControllerPartial 中,您可以进行验证并实现与此 Partial 模型相关的其他逻辑

      在这种情况下,您可以像这样使用它:

      public class MyController : Controller
      {
          ....
          public MyController()
          {
          MyChildController = new MyControllerPartial(this.ViewData);
          }
      
          [HttpPost]
          public ActionResult Index(MyPageViewModel model)
          {
          ...
          int childResult = MyChildController.ProcessSomething(model.MyPartialModel);
          ...
          }
      }
      

      附: 在第 3 步中,您可以使用 Html.Partial("PartialViewName", Model.MyPartialModel, )。更多详情见ASP.NET MVC partial views: input name prefixes

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多