如何在 ASP.NET MVC 的视图中调用多个操作?
Posted
技术标签:
【中文标题】如何在 ASP.NET MVC 的视图中调用多个操作?【英文标题】:How to call multiple actions in View in ASP.NET MVC? 【发布时间】:2012-06-06 13:45:31 【问题描述】:问题是:
我正在使用文本框获取字符串 q 并希望将其传递给 search
控制器中的 3 个不同操作。即action1(string q), action2(string q)
等等
现在我的操作语法:
public ActionResult action1(string q)
var mydata = from p in fab //LINQ logic
select new action1class
data1=p //assignment ;
return View("_partialAction1", mydata);
同样还有另外两个动作。
我正在使用 3 种不同的操作,因为我的 LINQ 逻辑从 3 个不同的来源获取数据,因此需要创建不同的 mydata
。
我的问题是:我正在尝试当我单击文本框的 'search' 按钮 时,所有 3 个操作都应该运行并在某些 <div id="action1">
标签中生成一个低于其他操作的部分视图。
我尝试使用ajax.BeginForm
,但它一次只能调用一个操作
@using (Ajax.BeginForm("action1", "Search", new AjaxOptions
HttpMethod = "GET",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "action1",
LoadingElementId="progress"
))
我也尝试使用ViewModel
,但问题是我无法将更大的模型与这些mydata
类型的数据一起传递给视图,这些数据在LINQ 中获得。在这种情况下,我不清楚如何使用视图模型。
我使用的方法是否正确?或者还有其他方法吗?我想通过单击按钮显示所有操作的结果。
【问题讨论】:
你为什么要把它分成 3 个动作? 我建议您再看看使用 AJAX。 AJAX 将允许 IIS 异步处理操作(请求),从而加快响应时间。你能发布你的 AJAX 代码吗? @DanielA.White 使用 3 个不同的操作,因为我的 LINQ 逻辑从 3 个不同的来源获取数据,因此需要创建 3 个不同的“mydata”。 @joshuam : 刚刚更新了 ajax 代码 【参考方案1】:MVC 框架中有两种类型的动作。第一个是主要操作,它们一次从浏览器调用。第二种类型称为Child Actions,这些操作不能从浏览器调用,而是从主要操作返回的视图调用。在一个主动作下可以调用多个子动作。因此,您必须研究子行为是否有帮助。
例如
// main action that returns a view
public ViewResult Index()
var model = ...
return View(model);
// couple of child actions each returns a partial view
// which will be called from the index view
[ChildActionOnly]
public PartialViewResult ChildAction1()
var model = ...
return PartialView(model);
[ChildActionOnly]
public PartialViewResult ChildAction2()
var model = ...
return PartialView(model);
// index view
Index.cshtml
@model ...
@Html.Action("ChildAction1");
@Html.Action("ChildAction2");
...
http://msdn.microsoft.com/en-us/library/ee839451.aspx
【讨论】:
很好的例子马克。但链接已损坏。【参考方案2】:每个请求只能执行一项操作。如果您希望一次单击获得 3 个不同的局部视图,您将需要构建一个布局页面,其中包含您想要的 3 个局部视图,并确保您的操作接收正确的参数以执行所有局部视图渲染.
【讨论】:
我已经准备好渲染东西了......但是如何通过一键单击或一个 ajax 请求调用 3 个操作? @Man8Blue:你没有。您调用 1 个动作。该操作必须反过来对应于包含您的部分视图的单个视图。 request->action 是 1:1 的关系。 @Man8Blue:如果你想进入 AJAX 来完成这项工作,那肯定会很有用,但它仍然可以归结为 1:1 的概念。每个局部视图都需要 1 个 AJAX 调用。【参考方案3】:为什么不将 ViewModel 传递给 partialViews。确保 ViewModel 中有不同的属性来保存 PartialView 特定数据和搜索文本。这是一个例子:
型号
public class Product
public string Name get; set;
public string Type get; set;
public string Class get; set;
视图模型
public class ProductSearch
public ProductSearch()
q = string.Empty;
Product1 = new Product();
Product2 = new Product();
public string q get; set;
public Product Product1 get; set;
public Product Product2 get; set;
_Partial1.cshtml
@model Test1.Models.ProductSearch
<div>Product1</div>
@Html.TextBoxFor(a => a.Product1.Name)
_Partial2.cshtml
@model Test1.Models.ProductSearch
<div>Product2</div>
@Html.TextBoxFor(a => a.Product2.Name)
ActualView.cshtml
@model Test1.Models.ProductSearch
@
ViewBag.Title = "ActualView";
<h2>ActualView</h2>
@using (Html.BeginForm())
@:SearchText
@Html.TextBoxFor(m => m.q)
Html.RenderAction("_Partial1", Model);
Html.RenderAction("_Partial2", Model);
<input type="submit" runat="server" id="btnSubmit" />
临时数据(您将从数据库/任何其他来源获取)
private List<Product> ProductsToSearch()
return new List<Product>() new Product() Name = "Product One", Class = "A", Type = "High" , new Product() Name = "Product Two", Class = "A", Type = "Low" , new Product() Name = "Product Three", Class = "B", Type = "High" ;
控制器操作
public ActionResult _Partial1(ProductSearch search)
Product Product1 = ProductsToSearch().Where(a => a.Class.Equals(search.q) && a.Type.Equals("High")).SingleOrDefault();
search.Product1 = Product1;
return PartialView(search);
public ActionResult _Partial2(ProductSearch search)
Product Product2 = ProductsToSearch().Where(a => a.Class.Equals(search.q) && a.Type.Equals("Low")).SingleOrDefault();
search.Product2 = Product2;
return PartialView(search);
[HttpPost]
public ActionResult ActualView(ProductSearch search)
return View(search);
public ActionResult ActualView()
ProductSearch search = new ProductSearch();
return View(search);
现在,如果您为SearchText
输入“A”并点击Submit Query
,您将获得两个不同的结果(基本上使用常见的搜索文本,并且根据每个局部视图中的搜索查询,它会生成不同的结果)
【讨论】:
以上是关于如何在 ASP.NET MVC 的视图中调用多个操作?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET MVC 中使用 Ajax 调用刷新局部视图?
如何在 ASP.NET Core MVC 的同一视图中添加/创建多个一对多关系