0

こんにちは、本日はよろしくお願いします!

(1) ビューにバインドされているビューモデル(MyViewModel.cs)は次のとおりです...

public class MyViewModel
{    
   public int ParentId { get; set; }  //property1       
   List<Item> ItemList {get; set;}   //property2

   public MyViewModel()   //Constructor
   {
     ItemList=new List<Item>();  //creating an empty list of items
   }
}

(2)以下のように(MyView.cshtml ビューから) ajax ポストバックを介してアクション メソッドを呼び出しています。

function AddItem() {
    var form = $('#MyForm');
    var serializedform = form.serialize();
    $.ajax({
        type: 'POST',
        url: '@Url.Content("~/MyArea/MyController/AddItem")',
        cache: false,
        data: serializedform,
        success: function (html) {$('#MyForm').html(html);}
    });
}

下のボタンをクリックすると、ajax ポストバックが呼び出されます...

<input type="button" value="Add" class="Previousbtn" onclick="AddItem()" />

(3)以下のように(MyController.csコントローラー)にアクションメソッドがあります...

public ActionResult AddItem(MyViewModel ViewModel)
{
   ViewModel.ItemList.Add(new Item());
   return View("MyView", ViewModel);
}

問題は、アクションから戻った後、ビューモデルにデータがないことです。しかし、3回目のポストバックでデータを取得できました!! 解決策を教えてください..

ビュー内の完全なフォーム コードは以下のとおりです...

    @model MyViewModel

    <script type="text/javascript" language="javascript">
        function AddItem() {
            var form = $('#MyForm');
            var serializedform = form.serialize();
            $.ajax({
                type: 'POST',
                url: '@Url.Content("~/MyArea/MyController/AddItem")',
                cache: false,
                data: serializedform,
                success: function (html) {
                    $('#MyForm').html(html);
                }
            });
        }

        function RemoveItem() {
            var form = $('#MyForm');
            var serializedform = form.serialize();
            $.ajax({
                type: 'POST',
                url: '@Url.Content("~/MyArea/MyController/RemoveItem")',
                cache: false,
                data: serializedform,
                success: function (html) {
                    $('#MyForm').html(html);
                }
            });
        }

     function SaveItems() {    
        var form = $('#MyForm');
        var serializedform = forModel.serialize();
        $.ajax({
            type: 'POST',
            url: '@Url.Content("~/MyArea/MyController/SaveItems")',
            cache: false,
            data: serializedform,
            success: function (html) {
                $('#MyForm').html(html);
            }
        });
    }

    </script>
    @using (Html.BeginForm("SaveItems", "MyController", FormMethod.Post, new { id = "MyForm" }))
    {    
        @Html.HiddenFor(m => Model.ParentId)
        <div>
             <input type="button" value="Save" onclick="SaveItems()" />
        </div>
        <div>
            <table>
                <tr>
                    <td style="width: 48%;">
                        <div style="height: 500px; width: 100%; overflow: auto">
                            <table>
                                <thead>
                                    <tr>
                                        <th style="width: 80%;">
                                            Item
                                        </th>
                                        <th style="width: 10%">
                                            Select
                                        </th>
                                    </tr>
                                </thead>
                                @for (int i = 0; i < Model.ItemList.Count; i++)
                                {
                                    @Html.HiddenFor(m => Model.ItemList[i].ItemId)                                
                                    @Html.HiddenFor(m => Model.ItemList[i].ItemName)                                
                                    <tr>
                                        @if (Model.ItemList[i].ItemId > 0)
                                        {

                                            <td style="width: 80%; background-color:gray;">
                                                @Html.DisplayFor(m => Model.ItemList[i].ItemName)
                                            </td>
                                            <td style="width: 10%; background-color:gray;">
                                                <img src="@Url.Content("~/Images/tick.png")" alt="Added"/>
                                                @Html.HiddenFor(m => Model.ItemList[i].IsSelected)
                                            </td>
                                        }
                                        else
                                        {                            
                                            <td style="width: 80%;">
                                                @Html.DisplayFor(m => Model.ItemList[i].ItemName)
                                            </td>
                                            <td style="width: 10%">
                                                @if ((Model.ItemList[i].IsSelected != null) && (Model.ItemList[i].IsSelected != false))
                                                {
                                                    <img src="@Url.Content("~/Images/tick.png")" alt="Added"/>                                            
                                                }
                                                else
                                                {
                                                    @Html.CheckBoxFor(m => Model.ItemList[i].IsSelected, new { @style = "cursor:pointer" })
                                                }
                                            </td>
                                        }
                                    </tr>
                                }
                            </table>
                        </div>
                    </td>
                    <td style="width: 4%; vertical-align: middle">
                        <input type="button" value="Add" onclick="AddItem()" />
                        <input type="button" value="Remove" onclick="RemoveItem()" />
                    </td>                
                </tr>
            </table>
        </div>    
    }
4

3 に答える 3

1

PartialViewResult を返す必要があり、次のようなことができます

$.post('/controller/GetMyPartial',function(html){
$('elem').html(html);});

    [HttpPost]
    public PartialViewResult GetMyPartial(string id
    {


        return PartialView('view.cshtml',Model);
    }
于 2012-10-03T20:17:50.260 に答える
0

私のプロジェクトでは、このようなjsonを使用して国IDの状態データを取得します

私からしてみれば

 <script type="text/javascript">
        function cascadingdropdown() {           
            var countryID = $('#countryID').val();
            $.ajax({
                url: "/City/State",
                dataType: 'json',
                data: { countryId: countryID },
                success: function (data) {
                    alert(data);
                    $("#stateID").empty();
                    $("#stateID").append("<option value='0'>--Select State--</option>");
                    $.each(data, function (index, optiondata) {
                        alert(optiondata.StateName);
                        $("#stateID").append("<option value='" + optiondata.ID + "'>" + optiondata.StateName + "</option>");
                    });
                },
                error: function () {
                    alert('Faild To Retrieve states.');
                }

            });
        } 
    </script>

私のコントローラーでは、json形式でデータを返します

public JsonResult State(int countryId)
        {           
            var stateList = CityRepository.GetList(countryId);
            return Json(stateList, JsonRequestBehavior.AllowGet);
        }

私はこれがあなたを助けると思います...。

于 2012-10-03T12:17:12.147 に答える
0

以下のように問題を解決しました...

問題:

ここに示したフォーム コードは、実際にはフォームを含む別のビュー ページの一部です。そのため、実行時にページ ソースを見たとき、2 つのフォーム タグがあり、1 つはもう 1 つの内側にあり、ブラウザは内側のフォーム タグを無視しました。

解決:

親ビュー ページでは、以前に Html.Partial を使用してモデルを渡してこのビューをレンダリングしていました。

@using(Html.BeginForm())
{
---
---
@Html.Partial('/MyArea/Views/MyView',MyViewModel)
---
---
}

しかし今、コンテンツのない div を追加しました。ボタンをクリックすると、(ajax ポストバックを介して) アクション メソッドが呼び出され、上記のビュー ページ( MyView.cshmtl )がこの空の div にレンダリングされます。

    @using(Html.BeginForm())
    {
    ---
    ---
    <div id="divMyView" style="display:none"></div>
    ---
    ---
    }

そのアクションは、上記の div にロードされる別のビューを返します。独自のフォーム タグを持つ個別のビューであるため、ポストバックごとにデータを送受信できます。

これに関するあなたの提案に感謝します:)

于 2012-10-09T08:32:07.290 に答える