我正在尝试使用JQuery AJAX调用Razor页面处理程序。这是示例代码。

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

        $("#SectionId").change(function () {
            var options = {};
            options.url = $(location).attr('href') + "/?SectionId=" + $("#SectionId").val() + "?handler=SelectByID";
            options.type = "GET";
            options.dataType = "json";
            options.success = function (data) {

            };
            options.error = function () {
                $("#msg").html("Error while making Ajax call!" + options.error.val);
            };

            $.ajax(options);
        });


    });
</script>


剃刀页cs代码:

public class CreateModel : PageModel
{
    private readonly ApplicationDbContext _context;
    private readonly UserManager<ApplicationUser> _userManager;
    private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);

    [BindProperty]
    public FileRecord FileRecord { get; set; }

    public List<SelectListItem> UserList { get; set; }
    public string SelectedSectionId { get; set; }

    public CreateModel(ApplicationDbContext context, UserManager<ApplicationUser> userManager)
    {
        _context = context;
        _userManager = userManager;
    }

    public IActionResult OnGetSelectByID(string SectionId)
    {
        return null;
    }

    public async Task<IActionResult> OnGetAsync()
    {
        //Prepare UserList
        UserList = new List<SelectListItem>();
        List<ApplicationUser> Users = await _context.Users.ToListAsync();
        foreach (var item in Users)
        {
            string role = Enum.GetName(typeof(EmRoles), EmRoles.NormalUser);
            if (await _userManager.IsInRoleAsync(item, role) && item.IsEnabled)
            {
                UserList.Add(new SelectListItem()
                {
                    Text = item.FullName,
                    Value = item.Id

                });
            }
        }

        //Sections
        ViewData["Sections"] = new SelectList(_context.Sections, "Id", "Name");

        //FileNOs
        ViewData["Files"] = new SelectList(_context.FileRegisters, "Id", "FileNo");

        //ViewData["ReceiverUserId"] = new SelectList(_context.Users, "Id", "Id");
        //ViewData["SenderUserId"] = new SelectList(_context.Users, "Id", "Id");
        return Page();
    }


    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        //Two File Records have to be created. One For Sender & One for receiver.
        FileRecord SenderRecord = new FileRecord
        {
            //create unique file id
            //FileId = Guid.NewGuid().ToString(),
            OutDate = DateTime.Now,

        };

        FileRecord ReceiverRecord = new FileRecord
        {
            //create unique file id
            //FileId = SenderRecord.FileId,
            InDate = SenderRecord.OutDate,

        };


        //Current logged-in user
        var user = await GetCurrentUserAsync();
        SenderRecord.OwnerUserId = user.Id;

        //Receiver
        ReceiverRecord.OwnerUserId = FileRecord.ReceiverUserId;
        ReceiverRecord.SenderUserId = SenderRecord.OwnerUserId;

        //Sender Record
        if (await TryUpdateModelAsync<FileRecord>(SenderRecord, "FileRecord", f => f.FileId, f => f.Remarks, f => f.Gist, f => f.ReceiverUserId))

        {
            //Receiver Record
            if (await TryUpdateModelAsync<FileRecord>(ReceiverRecord, "FileRecord", f => f.FileId, f => f.Gist))

            {
                _context.FileRecords.Add(SenderRecord);
                _context.FileRecords.Add(ReceiverRecord);
                await _context.SaveChangesAsync();
                return RedirectToPage("./Index");
            }
        }

        //If it reaches here. that means some error occurred.
        return null;

    }
}


问题是没有接到上面定义的Razor页面处理程序的调用。如果我跳过传入的SectionId参数,则仅调用处理程序。它工作正常。但在将参数发送到处理程序时,它无法工作,正在调用默认的OnGet()。

请帮助。

最佳答案

您不需要附加您的handler参数

options.url = $(location).attr('href') + "/?SectionId=" + $("#SectionId").val();


您还需要使用HttpGet属性修饰该方法

[HttpGet("GetSelectByID")]
public IActionResult OnGetSelectByID(string SectionId)
{
    return null;
}


然后您的网址才能调用此方法

http://localhost:xxxx/FileMovement/Create/GetSelectByID?SectionId=yyy


当在控制器上定义了多个GET时,必须使用HttpGet属性标记其他GET方法,并添加一个字符串以定义该方法的名称。

关于javascript - 带有JQuery AJAX的.net核心Razor页面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49534666/

10-10 01:20