C# 如何正确管理MVC模型对象中的额外属性?

C# 如何正确管理MVC模型对象中的额外属性?,c#,sql,asp.net-mvc,C#,Sql,Asp.net Mvc,我有一个MVC项目。其中我有一个核心域模型,它表示系统中的实体。我有一个汽车对象和图像对象以及。这辆车有图像。我也有一个汽车存储库和汽车服务类。我试图提供一个功能,从用户界面中删除汽车数据。所以我创建了一个名为DeleteCar的SP。此sp将由car存储库类调用。但是车辆删除是基于用户角色的。如果用户是管理员,那么他可以删除它,但是如果他不是,他将不被允许这样做。因此,我在SP中决定此示例中是否允许用户: ALTER PROCEDURE [dbo].[DeleteCar

我有一个MVC项目。其中我有一个核心域模型,它表示系统中的实体。我有一个汽车对象和图像对象以及。这辆车有图像。我也有一个汽车存储库和汽车服务类。我试图提供一个功能,从用户界面中删除汽车数据。所以我创建了一个名为DeleteCar的SP。此sp将由car存储库类调用。但是车辆删除是基于用户角色的。如果用户是管理员,那么他可以删除它,但是如果他不是,他将不被允许这样做。因此,我在SP中决定此示例中是否允许用户:

            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

}