1

問題は次のとおりです。

テキストボックスを使用して文字列qsearchを取得し、それをコントローラーの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);
  }

同様に、他に2つのアクションがあります。

LINQロジックは3つの異なるソースからデータを取得するため、3つの異なるアクションを使用しているため、異なるmydataものを作成する必要があります。

私の問題は次のとおりです。テキストボックスの[検索]ボタン<div id="action1">をクリックすると、3つのアクションすべてが実行され、一部のタグで部分ビューが上下に生成されます。

使用しようとしましajax.BeginFormたが、一度に呼び出すことができるアクションは1つだけです

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

また、使用しようとしましたが、問題は、アクションでLINQで取得されたViewModelこの種のデータとともに、より大きなモデルをビューに渡すことができなかったことです。mydataこの場合、viewmodelの使い方がよくわかりません。

私が使用しているアプローチは正しいですか?または他の方法はありますか?ボタンクリックですべてのアクションの結果を表示したい。

4

3 に答える 3

6

MVCフレームワークには2つのタイプのアクションがあります。最初のアクションはメインアクションであり、一度に1つずつブラウザから呼び出されます。2番目のタイプは子アクションと呼ばれ、これらのアクションはブラウザーからではなく、メインアクションによって返されるビューから呼び出すことができます。メインアクションの下で複数の子アクションを呼び出すことができます。ですから、彼らが助けになるかどうかにかかわらず、あなたは子供の行動を調べなければなりません。

元。

// 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

于 2012-06-06T14:15:13.547 に答える
0

リクエストごとに実行できるアクションは1つだけです。単一のクリックに対して3つの異なる部分ビューが必要な場合は、3つの部分ビューを希望どおりに含むレイアウトページを作成し、アクションがすべての部分ビューレンダリングを実行するための適切なパラメーターを受け取るようにする必要があります。 。

于 2012-06-06T13:49:19.853 に答える
0

ViewModelをpartialViewsに渡してみませんか。部分ビュー固有のデータと検索テキストを保持するために、ViewModelにさまざまなプロパティがあることを確認してください。次に例を示します。

モデル

public class Product
{
    public string Name { get; set; }
    public string Type { get; set; }
    public string Class { get; set; }
}

ViewModel

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);
    }

ここで、に「A」を入力しSearchTextてヒットSubmit Queryすると、2つの異なる結果が得られます(基本的に一般的な検索テキストが使用され、各部分ビューの検索クエリに基づいて、異なる結果が生成されます)

ここに画像の説明を入力してください

于 2012-06-06T16:07:30.570 に答える