1

在我的应用程序中,我有一个控制器消息

public class MessageController : BaseController
{
   ...
}

BaseController 是一个抽象类并包含一个方法 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 AutoComplete 小部件的来源。我正在尝试通过 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");
    }
});

我使用 Fiddler2 进行 Web 调试,请求中都是参数(用户名和 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

参数是好的,但为什么我不能调用这个方法?

感谢

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 方法只接受 post。删除 [HttpPost] 属性(您将需要使用 JsonRequestBehavior.AllowGet - 不推荐),或确保 jquery ajax 选项指定 type = post。

于 2012-10-14T14:00:08.877 回答