gpt4 book ai didi

asp.net-mvc-4 - 通过 ViewModel 的 Microsoft Odata api 在 PATCH 中存在问题

转载 作者:行者123 更新时间:2023-12-02 03:55:56 25 4
gpt4 key购买 nike

目标我的目标是通过实体产品发送一些额外的(未定义的)属性。例如,在 AngularJs ListView 中,我需要根据当前用户(我从 session 中获取)数据和产品 ID 计算出的权限,将某些产品显示为链接(可访问),而其他产品则不可访问。

是什么迫使我遇到这个问题

现在,Odata 不允许我在发送这样的 IQueryable 结果时添加额外的属性。

public IQueryable<Product> GET()
{
return db.Products.AsQueryable<Product>();
}

仅仅因为返回类型是 Product 并且添加额外的属性将使其成为其他内容,如果我像这样尝试

var result = db.Products.Select(p => new Product
{
ID = p.ID,
Accessible = (code for permission checks),
[other properties...]
}

找到解决方案

我用一个解决方案来解决这个问题,使 OdataController 成为一种新类型的 OdataProduct,它定义了我需要发送的属性来使列表权限感知。 (除了我的这个解决方案之外,您知道如何使列表权限感知吗?)

public class OdataProduct
{
public Product product { get; set; }
public OdataProduct(Product product)
{
this.product = product;
}
//
public void setPermissions(User user, string controller)
{
if (user == null) return;
isAllowed = [permission check code];
}
public bool isAllowed { get; set; }
}

我尝试继承此OdataProduct形式Product,但在将OdataProduct向下转换为Product时遇到问题接收 POST 请求以保存到数据库中。 Db.Products.Add();

现在,有了这个 ViewModel 和这种类型的 Controller ,我已经成功发送了依赖于当前 session 中用户的列表中所有产品的权限感知结果。

 public class OdataProductController : ODataController
{
private OfferAssistantDbContext db = new OfferAssistantDbContext();

// GET api/OdataProduct
public IQueryable<OdataProduct> GET()
{
var result = db.Products.AsQueryable<Product>();
var OResult = new List<OdataProduct>();
var currentUser = (User)HttpContext.Current.Session["LoggedUser"];
OdataProduct OProduct;
foreach (var item in result)
{
OProduct = new OdataProduct(item);
OProduct.setPermissions(currentUser, "Product");
OResult.Add(OProduct);
}

return OResult.AsQueryable<OdataProduct>();
}
//other methods of the controller below...
}

我想要解决的问题

  1. 当我向 OdataProduct Controller 发送 PATCH 请求时,如果我发送,我会得到一个不是 Product 的 Delta 对象Payload 中的 Product,并相应地修改 PATCH 方法的 Odata 参数以接收 Product 而不是 OdataProduct它被接收为空,而在默认情况下,我无法运行此命令来 PATCH Product 的真实实体而不是 ViewModel 。下面。

    var dbProduct = db.Products.Find(key); oDataProduct.Patch((dbProduct);//OdataProduct 不是 dbProduct 类型解决办法是什么?

  2. 我遇到的另一个问题是在设置上面的 OdataProduct 的权限时

    OProduct.setPermissions(currentUser, "产品");//进入该方法,异常行是 this.Childs = 产品.DependantProducts.Where(dp => dp.ParentID == 产品.ID).Count();

它表示 DataReader 已打开。虽然这不是主要问题,但也请在这里提供一些信息。

最佳答案

第一个问题可以这样解决,首先定义一个View Moodel ODataProduct,其中包含Model所需的属性加上IsAllowed:

public class ODataProduct
{
public int ID { get; set; }
public string Title { get; set; }
public bool IsAllowed { get; set; }
}

然后创建一个新的实体集,其元素类型为 ODataProduct。

private static IEdmModel GetModel()
{
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
var odataProductsEntitySet = modelBuilder.EntitySet<ODataProduct>("ODataProducts");
return modelBuilder.GetEdmModel();
}

最后一步是更新 ODataProductController 以执行 GET、POST、PATCH 等。

public class ODataProductsController : ODataController
{
private ProductsContext db = new ProductsContext();

public IHttpActionResult Get()
{
var Products = db.Products.Select(m => new ODataProduct()
{
ID = m.ID,
Title=m.Title,
// Other properties
IsAllowed = true,
});
return Ok( Products);
}

public ODataProduct Patch(int key, Delta<ODataProduct> odataProduct)
{
var dbProduct = db.Products.Single(m => m.ID == key);
foreach (string propertyName in odataProduct.GetChangedPropertyNames())
{
if ("IsAllowed" == propertyName)
{
continue;
}
object propertyValue;
if (odataProduct.TryGetPropertyValue(propertyName, out propertyValue))
{
var propertyInfo = typeof(Product).GetProperty(propertyName);
propertyInfo.SetValue(dbProduct, propertyValue);
}
}
db.SaveChanges();
ODataProduct odataProductReturn = new ODataProduct()
{
ID = dbProduct.ID,
Title=dbProduct.Title,
// other properties
};
odataProductReturn.IsAllowed = true;// or false according to your business logic
return odataProductReturn;
}
}

关于asp.net-mvc-4 - 通过 ViewModel 的 Microsoft Odata api 在 PATCH 中存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22373096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com