代码之家  ›  专栏  ›  技术社区  ›  Blake Rivell

在ASP.NET Core MVC中使用Razor页面设置带处理程序的Kendo UI网格数据源读取属性

  •  0
  • Blake Rivell  · 技术社区  · 7 年前

    我将剑道UI for ASP.NET核心MVC套件与Razor Pages web应用程序一起使用,因此我尝试将处理程序技术用于网格的服务器操作。

    @(Html.Kendo().Grid<CustomerViewModel>()
            .Name("CustomersGrid")
            .Columns(columns =>
            {
                columns.Bound(x => x.CustomerId).Title("Student ID");
                columns.Bound(x => x.CustomerName).Title("Name");
            })
            .Pageable()
            .Sortable()
            .DataSource(dataSource => dataSource
                .Ajax()
                .PageSize(20)
                .ServerOperation(true)
                .Read(read => read.Url("/Customers?handler=Read")))
             )
    

    我查看了“网络”选项卡,它正在向 http://localhost:5000/Customers?handler=Read 然而,我并没有在我的断点结束,我得到一个状态代码400。

    在razor页面的代码中,操作方法名为OnPostReadAsync

    下面是使用action方法的类:

    public class IndexModel : PageModel
    {
        private readonly ICustomerRepository _customerRepository;
        private readonly IMapper _mapper;
    
        public IndexModel(ICustomerRepository customerRepository, IMapper mapper)
        {
            _customerRepository = customerRepository;
            _mapper = mapper;
        }
    
        public IList<CustomerViewModel> Customers { get; set; }
    
        public async Task<IActionResult> OnPostReadAsync([DataSourceRequest] DataSourceRequest request)
        {
            // THIS IS WHERE I WANT IT TO GO FOR READ
    
            var customersFromDb = await _customerRepository.FilterAsync();
            return new JsonResult(_mapper.Map<IList<Customer>, IList<CustomerViewModel>>(customersFromDb).ToDataSourceResult(request));
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   crgolden    7 年前

    @inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
    

    我添加了这个函数来设置网格的 dataSource 请求:

    $(function () {
        const requestVerificationToken = '@Xsrf.GetAndStoreTokens(HttpContext).RequestToken';
        const beforeSend = req => req.setRequestHeader('RequestVerificationToken', requestVerificationToken);
        const grid = $("#grid").getKendoGrid();
        grid.dataSource.transport.options.create.beforeSend = beforeSend;
        grid.dataSource.transport.options.update.beforeSend = beforeSend;
        grid.dataSource.transport.options.destroy.beforeSend = beforeSend;
    });
    

    没有这个标志,所有的一切 PageModel 自定义处理程序将返回400个错误。

    参考: Prevent Cross-Site Request Forgery (XSRF/CSRF) attacks in ASP.NET Core

        2
  •  1
  •   AndyB    7 年前

    对我来说,使用POST获取数据是错误的。如果要使用GET,请将.Type(HttpVerbs.GET)附加到Read方法:

    .DataSource(data =>
    {
        data.Ajax()
          .Events(events => events.Error("grid_error"))
          .Read(read => read.Url("./Groups?handler=Read").Type(HttpVerbs.Get));
          //.Sort(sort => sort.Add("Name").Ascending())
          //.PageSize(20);
    })
    

    并保留通常的Ajax方法,但约定要求OnGet加上handler=。。。

    public IActionResult OnGetRead([DataSourceRequest] DataSourceRequest request)
    {
        var result = db.Queryable<IdentityRole>();
        return new JsonResult(result.ToDataSourceResult(request));
    }
    

    TagHelper样式类似于:

    <datasource type="DataSourceTagHelperType.Ajax" custom-type="AndyB.Identity.IdentityRole">
      <transport>
        <read url="./Groups?handler=Read" type="Get" />
      </transport>
      <sorts>
        <sort field="Name" direction="ascending" />
      </sorts>
    </datasource>
    

    不用于插入、更新或删除,继续使用帖子

    推荐文章