在ExtJs 6.0中使用Rest代理无法获取正确的ID以放入Httl URL

yftpprvb  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(137)

我的模特

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' }
    ]
});

我的店铺带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);
        }

错误

但所有的方法都不起作用。我在console.log中得到以下错误:

$id:1
留言:请求无效。
留言内容:parameters字典包含MovieRentals.Controllers.MoviesController中方法System.Web.Http.IHttpActionResult DeleteMovie(Int32)的非空类型System.Int32的参数id的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。

从extjs发送请求的URL是https://localhost:44369/Movies/DeleteMovie/MovieModel-75?_dc=1682656495712而不是https://localhost:44369/Movies/DeleteMovie/123

0mkxixxg

0mkxixxg1#

默认情况下,Ext JS使用名为id的字段作为模型示例的唯一标识符。由于模型中的标识符被不同地调用(Movie_id),ExtJS将为每个模型添加一个自动生成的标识符(例如MovieModel-75),并在REST请求中传递。这与用于向在客户端创建的、在服务器上还没有标识符的幻影记录添加标识符的机制相同。
您可以轻松地设置要与模型一起使用的自定义id属性。这样,你就不会告诉ExtJS use id,而是一个不同的字段。
只需将此添加到模型定义中:

Ext.define('Movie.model.MovieModel', {
    extend: 'Movie.model.Base',
    idProperty: 'Movie_id',
    ...
});

相关问题