1

私のアプリケーションでは、コントローラーメッセージがあります

public class MessageController : BaseController
{
   ...
}

BaseControllerはabstactクラスであり、メソッドFindUserForMessagesが含まれています。この「BaseController」は3つの類似したWebアプリケーションで親のように使用され、すべてのアプリケーションに共通の機能が含まれているため、このメソッドはこのコントローラーに含まれている必要があります。

public abstract class BaseController : Controller
{
    [Authorize]
    [HttpPost]
    [AcceptVerbs(HttpVerbs.Post)]
    public JsonResult FindUser(string userName, int maxRecords)
    {
        try
        {
            return Json(new JsonResult()
                {
                    IsError = false,
                    ErrorMessage = string.Empty,
                    Data = (from u in AccountModel.FindUser(userName, false).Take(maxRecords)
                            select new
                            {
                                UserName = u.UserName,
                                UserId = u.ProviderUserKey,
                                IsOnlien = u.IsOnline
                            })
                });
        }
        catch (Exception ex)
        {
            ...
        }
    }
}

このメソッドをJqueryUIオートコンプリートウィジェットのソースに使用したいと思います。私はAjaxによってこのメソッドを呼び出そうとしています:

$("#txtQuickMessageSendTo").autocomplete({
    source: function (request, response) {
        $.ajax({
            url: "/Message/FindUser",
            data: {
                userName: request.term,
                maxRecords: 10
            },
            success: function (resultObj) {
                if (resultObj.IsError) {
                    handleAjaxError(null, null, null, null, resultObj.ErrorMessage, null);
                    return;
                }
                else {
                    response($.map(data.Data, function (item) {
                        return { 
                            label: item.UserName,
                            value: item.ProviderUserKey
                        }
                    }));
                }
            }
        });
    },
    minLength: 2,
    select: function (event, ui) {
        //log(ui.item ? "Selected: " + ui.item.label : "Nothing selected, input was " + this.value);
    },
    open: function () {
        $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
    },
    close: function () {
        $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
    }
});

WebデバッグにFiddler2を使用しており、要求には両方ともパラメーター(userNameとmaxRecords)がありますが、サーバーはエラーをスローします。

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /Message/FindUserForMessages

パラメータはOKですが、なぜこのメソッドを呼び出せないのですか?

感謝

4

2 に答える 2

2

1)エラーメッセージは、メソッドにアクセスしようとしたことを示していますFindUserForMessages。しかし、あなたのコードのメソッドはFindUser

2)また、常にHtmlヘルパーメソッドを使用して、アクションメソッドへのパスを取得します。だから交換する

url: "/Message/FindUser",

url: "@Url.Action("FindUser","Message")",

3)デフォルトでは、ajaxアクションタイプはGETです。あなたの行動方法は属性で飾られて[HttpPost]います。したがって、そこからそれを削除するか、ajax呼び出しを行うときにそのことを伝えます。Authorizeまた、要件の属性が本当に必要であることを確認してください。

public JsonResult FindUser(string userName, int maxRecords)
{
  return Json( new { YourJsonDemo="replace here" }, 
                                                  JsonRequestBehaviour.AllowGet);
}

POSTまたは、それがリクエストであると言うためにクライアント側でそれを行います。

 $.ajax({
          url: "@Url.Action("FindUser","Message")",
          type: 'POST',
         //remaining code
于 2012-10-14T14:02:55.897 に答える
0

FindUserメソッドは投稿のみを受け入れます。[HttpPost]属性を削除するか(JsonRequestBehavior.AllowGet-非推奨を使用する必要があります)、jqueryajaxオプションでtype=postが指定されていることを確認してください。

于 2012-10-14T14:00:08.877 に答える