2

ASP.Net mvc 3 Webアプリケーション内に次のビューがあります:-

@model IEnumerable<MvcApplication4.Models.Account>

@{
    ViewBag.Title = "customer";
}

<h3>Customers Info</h3>


    <script  type="text/javascript">

        $(function() {

            $("#MoveRight,#MoveLeft").click(function(event) {

                var id = $(event.target).attr("id");

                var selectFrom = id == "MoveRight" ? "#SelectLeft" : "#SelectRight";

                var moveTo = id == "MoveRight" ? "#SelectRight" : "#SelectLeft";



                var selectedItems = $(selectFrom + " :selected").toArray();

                $(moveTo).append(selectedItems);

                selectedItems.remove;

            });

        });

    </script>  

      <select id="SelectLeft" multiple="multiple">
 @foreach (var item2 in Model.OrderBy(a=>a.ORG_NAME)) {
            <option value = "@item2.ORG_ID" >@item2.ORG_NAME</option>




}
      </select>      

    <input id="MoveRight" type="button" value=" Add >> " />

  <input id="MoveLeft" type="button" value=" << Remove " /> 

      <select id="SelectRight" multiple="multiple">           

      </select>
 @Html.ActionLink("Next Page", "CustomersDetials", "Home", new {  }, null)//for testing only

しかし、「次のページ」アクションリンクをクリックして、内にあるすべてのレコードをアクションメソッドmoveToに渡す必要があるという問題に直面してい ます。したがって、上記のビューからのcustomersDetials内部にあるアイテムを、を使用してアクションメソッドに渡すために使用できるアプローチを誰かが提案できます。movetohtml.actionlink

:::アップデート:::

ビューに以下を追加しました:-

@using (Html.BeginForm("CustomersDetials", "Home"))
{

      <select id="SelectLeft" multiple="multiple">
 @foreach (var item2 in Model.OrderBy(a=>a.ORG_NAME)) {
            <option value = "@item2.ORG_ID" >@item2.ORG_NAME</option>


}
      </select>      

    <input id="MoveRight" type="button" value=" Add >> " />

  <input id="MoveLeft" type="button" value=" << Remove " /> 



      <select id="SelectRight" name="SelectRight" multiple="multiple">           

      </select>
    <p>
<button type="submit">Next Page</button></p>

}

そして、選択した顧客の値に穴を開けるために、folloiwngViewModelクラスを作成しました。-

public class SelectedCustomers
{
    public IEnumerable<Account> Info { get; set; }
}

次に、次のアクションメソッドを追加しました:-

   public ActionResult CustomersDetials(string[] SelectRight)
        {
             foreach (var item in SelectRight) {

                // how to assign the values of the array to my viewmodel object       
        }

しかし、アクションメソッド内のviewmodelオブジェクトに配列の値を割り当てる方法を決定できません。

::: UPDATE2 :::

ここで私が終わったもの。アクションメソッドは次のようになります:-

    public ActionResult CustomersDetails(string[] SelectRight)
        {
            var selectedCustomers = new SelectedCustomers
            {
                Info = SelectRight.Select(GetAccount)
            };


        return View(selectedCustomers);

    }
    private Account GetAccount(string id)
    {


        return entities.Account.Find(id);
    }
}

そして、次のビュー:-

@model MvcApplication4.Models.SelectedCustomers

@{
    ViewBag.Title = "CustomerDetials";
}

<h2>CustomerDetials</h2>
//code goes here

@foreach (var item in Model.Info) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.ORG_ID)
        </td>

しかし、アプリケーションを実行すると、次のエラーが発生しました:-

The type of one of the primary key values did not match the type defined in the entity. See inner exception for details.

で:-

return entities.Account.Find(id);

::解決済み:: アクションメソッドとGETAccount関数の両方で文字列をlongに変更しました。

4

1 に答える 1

2

[次へ]リンクをフォームの送信ボタンにすることができます。次に、フォームが送信されると、選択リストの選択されたアイテムがサーバーに自動的に送信されます。それは私があなたに勧める解決策です。選択リストをフォームに入力するだけで、選択リストに名前を付けることを忘れないでください。これは、選択した値を取得するためのコントローラーアクションで使用するものだからです。

@using (Html.BeginForm("CustomersDetials", "Home"))
{
    <select id="SelectLeft" name="SelectLeft" multiple="multiple">
        @foreach (var item2 in Model.OrderBy(a => a.ORG_NAME)) 
        {
            <option value="@item2.ORG_ID">@item2.ORG_NAME</option>
        }
    </select>

    <select id="SelectRight" name="SelectRight" multiple="multiple">           
    </select>

    <button type="submit">Next Page</button>
}

ちなみに、ビューでこれらの恐ろしいforeachループを実行して複数の選択ボックスを生成する代わりに、組み込みのHtml.ListBoxForヘルパーを使用できます。

これで、コントローラーのアクションは次のようになります。

[HttpPost]
public ActionResult CustomersDetials(string[] selectRight)
{
    ... the selectRight parameter will contain the selected values in the 
        corresponding select list
}

このケースを処理する別の可能性は、AJAXを使用することです。

@Html.ActionLink("Next Page", "CustomersDetials", "Home", null, new { id = "next" })

その後:

$('#next').click(function() {
    $.ajax({
        url: this.href,
        type: 'POST',
        contentType: 'application/json;charset=utf-8',
        data: JSON.stringify(selectedItems),
        success: function(data) {

        }
    });
    return false;
});

もちろんselectedItems、グローバル変数を作成する必要があります。これは、現在、MoveRight、MoveLeftボタンのクリックハンドラー内で宣言しているためです。そうしないと、次のリンクのクリックイベント内でこの変数にアクセスできなくなります。


更新1:

更新に基づいて、次のようにビューモデルにデータを入力できます。

public ActionResult CustomersDetials(string[] selectRight)
{
    var selectedCustomers = new SelectedCustomers
    {
        Info = selectRight.Select(GetAccount)
    };
    ... use your view model here
}

private Account GetAccount(string id)
{
    // TODO: given the selected ID go and fetch the corresponding
    // Account instance and return it here:

    return new Account
    {
        Id = id
    };
}
于 2012-12-23T17:47:43.223 に答える