0

特定のレポートを表示する一連のデータを表示する実用的な MVC ページを作成しました (上位顧客の支出額)。ユーザーがそのレポートを開始日と終了日でバインドできるようにする 2 つの jQuery datepicker テキストボックスを追加しようとしています。ハンドラーを開始するjQueryクリックイベントがバインドされたHTMLアンカータグがあるという点で、現在機能しています。ハンドラーは開始日/終了日をコントローラーの HttpPost ActionResult メソッドに投げ、更新されたデータ セットを取得します。

問題は、(Content("true") を返すのではなく) ビューにデータを返そうとすると、データが返されず、ハンドラーから OnFailure メッセージが返されることです。この方法でビューにデータを渡すことは可能ですか、それとも Html.BeginForm タイプのアプローチを使用してデータを書き直す必要がありますか?

本当にありがとう!

コードは次のとおりです:(私の見解では)

<script type="text/javascript">
$(document).ready(function () {
    $(".datepicker").datepicker();

    $('#submit').click(function () {
        SetDateHandler($('#startdate').val(), $('#enddate').val(), "company");
    });

    function SetDateHandler(bounddate1, bounddate2, datetype) {
        $.ajax({
            //url: '/Projects/TestArray',
            url: '@Url.RouteUrl("SetBoundingDate")',
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: OnComplete,
            data: JSON.stringify({ startdate: bounddate1, enddate:bounddate2, type: datetype }),
            traditional: true,
            type: "POST",
            error: OnFail
        });

        return false;
    }
    function OnComplete(result) {
        //indow.location.href = window.location.href;
        alert("yay!");
        return true;
    }
    function OnFail(result) {
        alert('Request Failed');
        return false;
    }

});
</script>

<h2>Top Companies by Total Price for Won Quotes</h2>

<div style="float:right; width: 350px; margin: 15px;">
    <span style="float:right; margin-right: 50px;">Start Date: <input class="datepicker" id="startdate" /></span>
    <br />
    <span style="float:right; margin-right: 50px;">End Date: <input class="datepicker" id="enddate" /></span>
    <br />
    <a href="#" id="submit">Submit</a>
</div>

カスタム ルート: routes.MapRoute( name: "SetBoundingDate", url: "AjaxSetBoundingDate", defaults: new { controller = "Reports", action = "SetBoundingDates" } );

私のレポートコントローラーで:

[HttpPost]
public ActionResult SetBoundingDates(String startdate, String enddate, String type)
{
    Schedule.Models.Reports.TopCompaniesModel Companies = new Models.Reports.TopCompaniesModel();

    ActionResult view;

    if (type == "company")
    {
        view = TopCompaniesReport(startdate, enddate);
    }
    else
    {
        view = TopContactsReport(startdate, enddate);
    }
    //return View(view);
    return Content("true");
}

繰り返しますが、ここまで読んだ場合、ビューが正しく満たされた状態で Controller メソッドの最後にたどり着きますが、View を返そうとするとエラーになり、Content("true") を返すと動作しますが何もしませんページで変更します。

ありがとう!

4

1 に答える 1

1

助けようとしてくれてありがとう。私のアプローチは間違っていました。最終的には、かみそりのポストバック方式に切り替える必要があることがわかりました。実際、この方法もずっと簡単でした。

これが私がやった方法です:

    <div style="float:right; width: 550px; margin: 15px;">
        @using (Html.BeginForm(ViewContext.RouteData.GetRequiredString("action"), "Reports", FormMethod.Post, new { id = "TheForm" }))
        {
             <span style="float:right;">

                    <div style="margin-right: 50px;float:right;">Start Date: <input class="datepicker" name="startdate" id="startdate" /></div>
                    <div style="margin-right: 50px;float:right; margin-top: 5px; clear: both;">End Date: <input class="datepicker" name="enddate" id="enddate" /></div>

                    <input id="submit" name="submit" type="submit" value="Update" style="margin-top: 10px; clear: both;float:right;" />

             </span>
             <span style="float: left;">
                @Html.DropDownList("DateDdl", (SelectList)ViewBag.DateDropDown)
             </span>           

        }
    </div>

ご覧のとおり、現在のコントローラー名をポストバックするために渡しているため、実際にはこの方法の方がはるかに優れています。このようにして、この機能を共有の部分ビューに配置し、レポート領域内の任意のビューで再利用できるようにします。

これが他の誰かに役立つことを願っています!

于 2012-07-23T15:35:07.620 に答える