ASP.NET MVC部分视图控制器动作

80
我非常新手网站应用程序的开发,想从最新的技术开始学起,所以我同时想学习 asp.net 和 MVC 框架。这对于专业的 MVC 开发者来说可能是一个非常简单的问题。
我的问题是:部分视图是否应该有关联的操作,如果是,当正常页面使用 RenderPartial() 在部分视图上时,这个操作会被调用吗?
5个回答

140

虽然你可以有一个返回部分视图的操作,但你不需要一个操作来呈现部分视图。 RenderPartial接受部分视图并将其呈现,如果提供了给定的模型和视图数据,则使用它们呈现到当前(父)视图中。

如果你正在使用AJAX加载/重新加载页面的某个部分,则可能希望有一个返回部分视图的操作。在这种情况下,不需要返回完整视图,因为你只想重新加载页面的某个部分。在这种情况下,你可以使操作仅返回对应于该部分的部分视图。

标准机制

在普通视图中使用部分视图(不需要操作)

...some html...
<% Html.RenderPartial( "Partial", Model.PartialModel ); %>
...more html..

Ajax机制

通过Ajax重新加载页面的部分内容(注意:在初始页面加载时,部分内容被渲染为内联元素)。

...some html...
<div id="partial">
<% Html.RenderPartial( "Partial", Model.PartialModel ); %>
</div>
...more html...

<script type="text/javascript">
   $(function() {
       $('#someButton').click( function() {
           $.ajax({
              url: '/controller/action',
              data: ...some data for action...,
              dataType: 'html',
              success: function(data) {
                 $('#partial').html(data);
              },
              ...
           });
       });
   });
</script>

AJAX的控制器

public ActionResult Action(...)
{
     var model = ...

     ...

     if (Request.IsAjaxRequest())
     {
          return PartialView( "Partial", model.PartialModel );
     }
     else
     {
          return View( model );
     }
}

我明白了,我只是在玩 MVC 应用程序的 VS 模板。例如,我正在尝试在部分视图中显示多个客户列表。我目前有一个数据传输模型类,如何将此模型发送到部分视图而不涉及呈现此部分视图的页面视图?谢谢你的帮助! - yogibear
1
局部视图总是包含在主视图中。仅当你通过 AJAX 进行更新时,你才会单独返回该部分。假设你想要显示客户列表,可能会使用一个局部视图。你可以在视图中使用 foreach 循环来迭代列表(包含在视图模型中),将每个列表作为它的模型传递给局部视图。 - tvanfosson
哇,非常全面的回答,谢谢tvanfosson! - yogibear
一个建议是使用 Url.Action,因为像这样硬编码路径将在路由更改或映射结构更改时破坏应用程序。 - Jean-Paul

4

我能够用这个逻辑实现类似的功能。

在 .cshtml 文件中:

@Html.Action("ActionMethodName", "ControllerName");

在控制器内部

[Route("some-action")]
public ActionResult ActionMethodName()
{
    var someModel = new SomeModel();
    ...
    return PartialView("SomeView.cshtml", someModel);
}

就是这样。

如果你需要将数值从.cshtml传递到操作方法,那也是可以的。


1
非常完美的示例。您以简明清晰的方式展示了控制器和视图之间的交互及其代码,没有任何繁琐冗余的内容。感谢您。 - eaglei22

4

接受的答案完全正确,但我想补充一下,您可以使用jQuery load加载部分视图。如果您不考虑并发,则需要更少的配置。

$("#Your-Container").load("/controller/action/id");

1
一个建议是使用Url.Action,因为像这样硬编码路径会在路由更改或映射结构更改时破坏应用程序。 - Jean-Paul
完全同意你的看法,@JpHouten。 - Saeid

2
答案是否定的。但有时您需要在局部视图后面添加一些控制器操作。然后,您可以创建一个返回部分视图的actionMethod。此actionMethod可以在另一个视图中调用:
@Html.Action("StockWarningsPartial", "Stores")

action方法的样式可以是:

public ActionResult StockWarningsPartial()
{
      ....              
      return View("StockWarningsPartial", warnings);

}

视图 'StockWarningsPartial.cshtml' 的开头如下:

@{
    Layout = null;
}

使其不再重新渲染周围的布局。


0
 public ActionResult GetStateList(int country_id)
 {
      List<stateDTO> stateList = new List<stateDTO>();
      stateList = bll.GetState(country_id);
      ViewBag.sList = new SelectList(stateList, "state_id", "State_Name");
      return PartialView("DisplayStates");
 }

你的回答可以通过添加额外的支持信息进行改进。请[编辑]以添加更多细节,例如引用或文档,以便他人可以确认您的答案正确无误。您可以在帮助中心中找到有关编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接