如何在 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 的同一视图中添加/创建多个一对多关系

asp.net mvc,以 JSON 形式返回多个视图

是否可以将多个模型对象发送到 ASP.NET MVC 视图?

如何在 ASP.NET MVC 中使用多个表单元素

将多个模型传递给 ASP.NET MVC 中的视图