问题是:
我正在使用文本框来获取字符串 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。
我使用的方法是否正确?或者还有其他方式吗?我想通过点击按钮显示所有操作的结果。
答案 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");
...
答案 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
,您将获得两个不同的结果(基本上使用常见的搜索文本,并根据每个局部视图中的搜索查询生成不同的结果结果)