如何在ASP.NET MVC中调用View中的多个操作?

时间:2012-06-06 13:45:32

标签: c# asp.net-mvc linq mvvm view

问题是:

我正在使用文本框来获取字符串 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

我的问题是:当我点击文本框的'搜索'按钮时,我正在尝试这样做,然后应该运行所有3个操作,并在某些<div id="action1">标记中生成一个低于其他的部分视图

我尝试使用ajax.BeginForm但它一次只能调用一个动作

@using (Ajax.BeginForm("action1", "Search", new AjaxOptions
{
    HttpMethod = "GET",
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "action1",
    LoadingElementId="progress"
}))

我也尝试使用ViewModel,但问题是我无法将更大的模型传递给视图以及在操作中LINQ中获得的这些mydata类数据。在这种情况下,我不清楚如何使用viewmodel。

我使用的方法是否正确?或者还有其他方式吗?我想通过点击按钮显示所有操作的结果。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

每个请求只能有一个操作。如果要为单个单击创建3个不同的局部视图,则需要构建一个布局页面,其中包含3个部分视图的方式,并确保操作接收到适当的参数以执行所有局部视图渲染

答案 2 :(得分:0)

为什么不将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" />
}

临时数据(您将从DB /任何其他来源获取)

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,您将获得两个不同的结果(基本上使用常见的搜索文本,并根据每个局部视图中的搜索查询生成不同的结果结果)

enter image description here