You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExtJS 6.0使用Rest Proxy无法传递正确ID至Web API的问题

解决ExtJS 6.0 Rest Proxy删除请求无法传递正确主键的问题

问题原因

ExtJS的Rest Proxy默认使用模型的idProperty(默认值为id)构建删除请求的URL路径。你的模型主键是Movie_id,但未显式指定idProperty,导致Proxy使用模型内部生成的标识(如MovieModel-75)代替实际的Movie_id值,最终请求URL不符合Web API路由要求,引发参数为空的错误。

解决方案

1. 为模型指定主键字段

在MovieModel中添加idProperty配置,明确告知ExtJS主键为Movie_id:

Ext.define('Movie.model.MovieModel', {
    extend: 'Movie.model.Base',
    idProperty: 'Movie_id', // 指定主键字段
    fields: [
        { name: 'Movie_id', type: 'int' },
        { name: 'Movie_name', type: 'string' },
        { name: 'Movie_details', type: 'string' },
        { name: 'Movie_release', type: 'string'},
        { name: 'Movie_url', type: 'string' },
        { name: 'Movie_price', type: 'int' },
        { name: 'Rent_day', type: 'string' }
    ]
});

2. 简化删除逻辑(可选)

原删除代码可简化,无需重复查找记录:

var data = store.findRecord('Movie_name', name);
if (data) {
    store.remove(data);
    store.sync();
}

3. 验证Proxy配置(无需修改)

你的Proxy的destroy URL为https://localhost:44369/Movies/DeleteMovie,Rest Proxy会自动在URL后拼接Movie_id值,生成符合Web API路由[Route("Movies/DeleteMovie/{id}")]的请求地址(如https://localhost:44369/Movies/DeleteMovie/123),无需额外调整。


原问题代码及报错信息

我的模型

Ext.define('Movie.model.MovieModel', {
    extend: 'Movie.model.Base',

    fields: [
        { name: 'Movie_id', type: 'int' },
        { name: 'Movie_name', type: 'string' },
        { name: 'Movie_details', type: 'string' },
        { name: 'Movie_release', type: 'string'},
        { name: 'Movie_url', type: 'string' },
        { name: 'Movie_price', type: 'int' },
        { name: 'Rent_day', type: 'string' }
    ]
});

我的Store及URL配置

Ext.define('Movie.store.MovieStore', {
    extend: 'Ext.data.Store',
    alias: 'store.movie',
    storeId: 'movieStore',
    model: 'Movie.model.MovieModel',
    Fields: ['Movie_id', 'Movie_name', 'Movie_details', 'Movie_release', 'Movie_url', 'Movie_price'],
    proxy: {
        type: 'rest',
        url:'/api/Movies',
        disableCaching: true,
        useDefaultXhrHeader: false,
        api: {
            create: 'https://localhost:44369/Movies/AddMovie',
            read: 'https://localhost:44369/Movies/GetMovie',
            update: 'https://localhost:44369/Movies/EditMovie',
            destroy: 'https://localhost:44369/Movies/DeleteMovie'
        },
        reader:{
            type:'json',
            headers: { 'Accept': 'application/json' }            
        },
        writer: {
            type: 'json',
            writeAllFields: false,
        }
    }, 
    autoLoad: true
});

删除记录的控制器代码

var data = store.findRecord('Movie_name', name);
var id = data.get('Movie_id');
store.remove(store.findRecord('Movie_id',id,0,false,false,false));
store.sync();

我的Web API代码

[Route("Movies/DeleteMovie/{id}")]
[EnableCors("*", "*", "*")]
[System.Web.Http.AcceptVerbs("Delete", "Post","Get")]
[System.Web.Http.HttpDelete]
public IHttpActionResult DeleteMovie(int id)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    Movie movie = db.Movie.Find(id);

    db.Movie.Remove(movie);
    db.SaveChanges();

    return Ok(movie);
}

报错信息

控制台报错如下:

$id: 1
Message: 请求无效。
Message Detail: 参数字典包含针对方法System.Web.Http.IHttpActionResult DeleteMovie(Int32)(位于MovieRentals.Controllers.MoviesController)的非可空类型System.Int32参数id的null项。可选参数必须是引用类型、可空类型或声明为可选参数。


内容的提问来源于stack exchange,提问作者Bryan art

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:43:16