1

これは私を狂わせています!

以下のスクリプトを使用してAjaxを使用して入力されたビューがあります。

function loadAcquisitions() {
    var description = $("input#searchDescription").val();
    var startDate = $("input#searchStartDate").val();
    var endDate = $("input#searchEndDate").val();

    $.ajax({
        type: "POST",
        dataType: "json",
        url: "/Acquisition/Find",
        data: { searchDescription: description, searchStartDate: startDate, searchEndDate: endDate },
        success: function (jsonresults) {
            $("tbody#acquisitionContent").find("tr").remove().end();

            var pageCount = parseInt(jsonresults.length / pageSize);
            var startItemIndex = currentPageIndex * pageSize;
            var itemsToDisplay = pageSize + startItemIndex;

            if ((jsonresults.length - startItemIndex) < pageSize) {
                itemsToDisplay = jsonresults.length - startItemIndex + pageSize;
            }

            for (var i = startItemIndex; i < itemsToDisplay; i++) {
                $("tbody#acquisitionContent").append('<tr>' +
                    '<td><a href="/Acquisition/Edit/' + jsonresults[i].AcquisitionID + '">Edit</a></td>' +
                    '<td>' + jsonresults[i].AcquisitionDescription + '</td>' +
                    '<td>' + jsonresults[i].AcquisitionDate + '</td>' +
                    '<td>$' + jsonresults[i].AcquisitionCost + '</td>' +
                    '<td>$' + jsonresults[i].InstallationCost + '</td>' +
                    '<td class="last">$' + jsonresults[i].DeliveryCost + '</td>' +
                    '</tr>');
            }

            $('#pageTitle').text('Page ' + (currentPageIndex + 1) + ' of ' + pageCount);
        },
        error: function (c, b, a) {
            alert(a);
        }
    });
}

リンクは次の行を使用して生成されることに注意してください。

'<td><a href="/Acquisition/Edit/' + jsonresults[i].AcquisitionID + '">Edit</a></td>'

リンクタグは正しく生成されているようで、次の形式になっています。

/Acquisition/Edit/123

コントローラには、次のような「編集」という関数があります。

public ActionResult Edit(int acquisitionID)
{
    Acquisition acquisition = Acquisition.Get(acquisitionID);
    return View(acquisition);
}

次に、global.asaxに、次のような「編集」用に定義されたルートがあります。

routes.MapRoute(
    "EditAcquisition",
    "{controller}/{action}/{acquisitionID}",
    new { controller = "Acquisition", action = "Edit"}
    );

コントローラーの「編集」関数を変更して、エラーを取り除くnull許容のint(int?)acquisitionIDを受け入れようとしましたが、コントローラーにnullが渡されているという事実は変更されません「編集」関数Ajaxコードによって生成されたリンクから。

どんな助けでも大歓迎です!

ありがとう!

アップデート:

global.asaxを更新し、次のようなパラメーターとして「acquisitionID」を追加すると、次のようになります。

routes.MapRoute(
    "EditAcquisition",
    "{controller}/{action}/{acquisitionID}",
    new { controller = "Acquisition", action = "Edit", acquisitionID = 0 }
    );

アプリケーションの動作は大きく異なり、ナビゲーションリンクにはすべて「インデックス」が追加されています。

/Acquisition/

になります

/Acquisition/Index

アップデート:

これがglobal.asaxのRegisterRoutesメソッドです。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "EditProperty",
        "{controller}/{action}/{propertyID}",
        new {controller = "Property", action = "Edit"}
        );

    routes.MapRoute(
        "EditAssignee",
        "{controller}/{action}/{assigneeID}",
        new {controller = "Assignee", action = "Edit"}
        );

    routes.MapRoute(
        "EditAcquisition",
        "{controller}/{action}/{acquisitionID}",
        new {controller = "Acquisition", action = "Edit"}
        );

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new {controller = "Home", action = "Index", id = UrlParameter.Optional}
        );
}
4

2 に答える 2

1

私のルートには、常に次のURLParameter設定を含めます。

routes.MapRoute(
                "EditAcquisition",
                "{controller}/{action}/{acquisitionID}",
                new
                {
                    controller = "Acquisition",
                    action = "Edit",
                    acquisitionID = UrlParameter.Optional
                }
            );

これは、パラメーターがnull許容整数でない場合でも機能します。私もやった

acquisitionID = 0

なぜそれが機能するのか、私には本当に説明できないのではないかと思います。

編集

他に試すべきこと

"EditAcquisition",
 "Acquisition/Edit/{acquisitionID}",
 new
 {
     controller = "Acquisition",
     action = "Edit",
     acquisitionID = UrlParameter.Optional
 }

したがって、URLは、デフォルトである3番目ではなく2番目のパラメーターURLと照合されます。

于 2012-04-11T12:41:42.840 に答える
1

あなたのルート

routes.MapRoute(
        "EditProperty",
        "{controller}/{action}/{propertyID}",
        new {controller = "Property", action = "Edit"}
        );

他のすべてのルートに一致します..(それらはすべて同じパターンを持っているため/controller/action/id

によって提供される値new {controller = "Property", action = "Edit"}はデフォルトであり、許可されている値ではありません。

したがって、フォーム内のすべてのURLはそれ/somecontroller/someaction/someidに一致し、IDはと呼ばれpropertyIDます。

だからあなたはacquisitionID

その1つのルートのみを保持し、のpropertyIDような一般的な名前を付けidてメソッドで使用するか、constraints同じパターンを持つすべてのルートに使用します

routes.MapRoute(
        "EditProperty",
        "{controller}/{action}/{propertyID}",
        new {controller = "Property", action = "Edit"},
        new {controller = "Property", action="Edit"} // constraint
        );
于 2012-04-11T13:11:16.023 に答える