C# 如何正确管理MVC模型对象中的额外属性?
我有一个MVC项目。其中我有一个核心域模型,它表示系统中的实体。我有一个汽车对象和图像对象以及。这辆车有图像。我也有一个汽车存储库和汽车服务类。我试图提供一个功能,从用户界面中删除汽车数据。所以我创建了一个名为DeleteCar的SP。此sp将由car存储库类调用。但是车辆删除是基于用户角色的。如果用户是管理员,那么他可以删除它,但是如果他不是,他将不被允许这样做。因此,我在SP中决定此示例中是否允许用户:C# 如何正确管理MVC模型对象中的额外属性?,c#,sql,asp.net-mvc,C#,Sql,Asp.net Mvc,我有一个MVC项目。其中我有一个核心域模型,它表示系统中的实体。我有一个汽车对象和图像对象以及。这辆车有图像。我也有一个汽车存储库和汽车服务类。我试图提供一个功能,从用户界面中删除汽车数据。所以我创建了一个名为DeleteCar的SP。此sp将由car存储库类调用。但是车辆删除是基于用户角色的。如果用户是管理员,那么他可以删除它,但是如果他不是,他将不被允许这样做。因此,我在SP中决定此示例中是否允许用户: ALTER PROCEDURE [dbo].[DeleteCar
ALTER PROCEDURE [dbo].[DeleteCar]
(
@CarId INT
,@UserId INT
)
AS
BEGIN
DECLARE @ImagesNamesToBeDeleted Table([FIleName] NVARCHAR(255))
DECLARE @IsAuthorized bit = 0;
SELECT @IsAuthorized = dbo.IsAuthorizedToDeleteCar(@CarId, @UserId);
IF(@IsAuthorized = 0)
BEGIN
IF EXISTS(SELECT 1 FROM @ImagesNamesToBeDeleted)
BEGIN
SELECT @IsAuthorized AS IsAuthorized , [FIleName] AS FIleName FROM @ImagesNamesToBeDeleted
END
ELSE
BEGIN
SELECT @IsAuthorized AS IsAuthorized , '' AS FIleName
END
END
SET NOCOUNT ON;
DECLARE @TranCount INT;
SET @TranCount = @@TRANCOUNT;
BEGIN TRY
IF @TranCount = 0
BEGIN TRANSACTION
ELSE
SAVE TRANSACTION DeleteCar;
IF (@IsAuthorized = 1)
BEGIN
-- Delete car data
IF EXISTS(SELECT 1 FROM @ImagesNamesToBeDeleted)
BEGIN
SELECT @IsAuthorized AS IsAuthorized , [FIleName] AS FIleName FROM @ImagesNamesToBeDeleted
END
ELSE
BEGIN
SELECT @IsAuthorized AS IsAuthorized , '' AS FIleName
END
END
LBEXIT:
IF @TranCount = 0
COMMIT;
END TRY
BEGIN CATCH
DECLARE @Error INT, @Message VARCHAR(4000), @XState INT;
SELECT @Error = ERROR_NUMBER() ,@Message = ERROR_MESSAGE() ,@XState = XACT_STATE();
IF @XState = -1
ROLLBACK;
IF @XState = 1 AND @TranCount = 0
rollback
IF @XState = 1 AND @TranCount > 0
ROLLBACK TRANSACTION DeleteCar;
RAISERROR (' DeleteCar: %d: %s', 16, 1, @error, @message) ;
END CATCH
END
Sp很好。但我正在重新输入图像名称,以便从服务器中删除这些图像
所以,如果用户被授权,posiioble返回结果是
未授权文件名
1 A.jpg
如果用户不是,则
未授权文件名
0-无数据
下面是调用SP的repoisptry方法
public async Task<IList<Image>> DeleteCarAsync(int carId, int userId)
{
var parameters = new[]
{
new SqlParameter("CarId", SqlDbType.Int) {Value = carId},
new SqlParameter("@UserId", SqlDbType.VarChar) {Value = userId}
};
using (var reader = await SqlHelper.ExecuteReaderAsync(_connectionString, CommandType.StoredProcedure, "DeleteCar", parameters))
{
return reader.Select(r =>
{
var image = new Image
{
FileName = r["FileName"].ToString(),
IsAuthorized -- I want to read this value becuase based on it i Will decide if I will physically delete the images or not.
};
return image;
}).ToList();
}
}
还有别的办法吗 是的,那样行得通。更好的用户体验是,甚至不允许用户尝试删除他们无权删除的车辆。这样,客户就不必看到错误消息。您可以在第一次构建页面时在模型上发送IsAuthorized标志,并相应地更改页面
您可能仍然希望在删除时进行IsAuthorized检查,以防在呈现页面和执行删除之间用户的权限发生更改。谢谢您的回答。我想到了这一点,我知道这是正确的方式。但我仍然希望用户看到错误消息。因为它是一个管理员用户,所以如果他看到此错误消息,没有问题,因为它将帮助他了解如何管理删除操作。我只是想知道如何在我的逻辑中以适当的方式管理这个额外的属性?
if (images[0].IsAuthorized)
{
// delete images physically
}