1

asp.net mvc 3 を使用して Web アプリケーションを開発しており、ViewModel に含まれているリストを変更してから、JQuery の変更を加えてコントローラーに投稿しようとしています。問題は、到着時に ViewModel に値が含まれていないことです。

ViewModel は次のようになります。

public class OfferListViewModel
{
    public List<OfferViewModel> Offers { get; set; }
}

public class OfferViewModel
{
    public Guid Id { get; set; }

    public double Total { get; set; }
}

コントローラーの方法:

[Authorize]
public ActionResult Index()
{
    OfferList list = this._offerService.GetOfferListById(1234);

    OfferListViewModel model= new OfferListViewModel
    {
        Offers = list.OfferListProducts.Where(o => o.Product.ProductCategory == (int)ProductCategory.Print).ToViewModel().ToList()
    };

    return View(model);
}

list.OfferListProducts は、ヘルパー ToViewModel() と最後に ToList() で変換された IEnumerable です。

[HttpPost]
[Authorize]
public ActionResult UpdateOfferList(OfferListViewModel offers)
{
    // do something
}

意見:

@model Models.OfferListViewModel 

<form id="mywall-updateofferlist-form" class="form-horizontal" action="@Url.Action("UpdateOfferList", "MyWall")" method="post">
    @Html.HiddenFor(model => model.ProductCategory)
    <table class="table table-hover">
        <thead>
            <tr>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
            @for (int count=0; count < Model.Offers.Count(); count++)
            {
                @Html.HiddenFor(model => model.Offers[count].Id)
                <tr>
                    <td>@Html.EditorFor(model => model.Offers[count].Total)</td>
                </tr>
            }
        </tbody>
    </table>
</form>

JavaScript:

<script type='text/javascript'>
    $(function () {
        $('form[id=mywall-updateofferlist-form]').change(function () {
            if ($(this).valid()) {
                $.post($(this).attr('action'), $(this).serialize(), function (data) {
                    if (data.success) {
                        // do something
                    } else {
                        // do something else
                    }
                });
                return false;
            }
        });
    });
</script>

誰かが間違いを見つけることができますか?ViewModels には、コントローラーの post メソッドで必ずしも必要ではないため、ここでの説明を簡素化するためにマップ/除外されていない、より多くの属性があります。これはどういうわけか問題になるでしょうか?Id は HiddenFor にマップされているため、投稿後に ViewModel に含める必要があり、他の値は null にする必要がありますか?

編集:

Firebug の投稿:

Offers[0].Id    1c5bdc21-8f8c-4ad2-a4a0-49e4011e3ba6
Offers[0].Total 0.6
Offers[1].Id    12ede957-8a7e-47a9-8e86-a388d60ea2d9
Offers[1].Total 1.12

Offers%5B0%5D.Id=1c5bdc21-8f8c-4ad2-a4a0-49e4011e3ba6&Offers%5B0%5D.Total=0.6&Offers%5B1%5D.Id=12ede957-8a7e-47a9-8e86-a388d60ea2d9&Offers%5B1%5D.Total=1.12

私の問題はこれに似ています:ビュー モデル IEnumerable<> プロパティはポスト メソッドから null (バインディングではない) を返していますか?

しかし、IEnumerable を正しく表示されるリストに変換しましたが、コントローラーにポストされたときにマップされません。

4

1 に答える 1

0
<script type='text/javascript'>
    $(function () {
        $('form[id=mywall-updateofferlist-form]').change(function () {

           var $this = $(this);
            if ($this.valid()) {
                $.post($this.attr('action'), $this.serialize(), function (data) {
                    if (data.success) {
                        // do something
                    } else {
                        // do something else
                    }
                });
                return false;
            }
        });
    });
</script>

これを試してください...関数$(this)内のフォームオブジェクトと等しくありません...$post

Firebug コンソールを使用して、正しい投稿情報が取得されているかどうかを確認する必要があります。

于 2012-11-13T15:01:15.070 に答える