MVC 3 - что такое и зачем использовать?в методе - вопрос, связанный с предыдущей темой из-за невозможности загрузить несколько изображений в БД - PullRequest
0 голосов
/ 17 июня 2011

НикЛарсен Киндли решил проблему для меня пару месяцев назад. Я должен был спросить его тогда, так что это действительно моя ошибка. Если NickLarsen может ответить, спасибо за то, что связались со мной снова, если нет, то если кто-то еще может сказать мне правильный ответ, наиболее подходящий ему. Заранее спасибо.

Предыдущая тема ...

невозможно загрузить несколько изображений в БД с помощью asp.net mvc

NickLarsen использовал следующий код, и я хочу знать, что такое и зачем использовать? в коде. Вот код ...

    public ActionResult GetImage(int id, int? imageNum)
    {
        imageNum = imageNum ?? 0; // here

        const string alternativePicturePath = @"/Content/question_mark.jpg";
        MemoryStream stream;

        SubProductCategory4 z = db.SubProductCategory4.Where(k => k.SubProductCategoryFourID == id).FirstOrDefault();

        byte[] imageData = null;

        if (z != null)
        {
            imageData = imageNum == 1 ? z.Image1 : imageNum == 2 ? z.Image2 : imageNum == 3 ? z.Image3  : null; // here
        }

        if (imageData != null)
        {
            stream = new MemoryStream(imageData);
        }
        else
        {
            var path = Server.MapPath(alternativePicturePath);

            stream = new MemoryStream();
            var imagex = new System.Drawing.Bitmap(path);
            imagex.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
            stream.Seek(0, SeekOrigin.Begin);
        }

        return new FileStreamResult(stream, "image/jpg");
    }

Ответы [ 4 ]

3 голосов
/ 17 июня 2011

Это троичный оператор. Синтаксис:

condition ? <value if true> : <value if false>

, поэтому, если imageNum равно 1, imageData = z.Image1.
Если он не равен 1, он проверяет оставшуюся часть утверждения. В этом случае ложное условие имеет другую троицу, и оно проверяет, если imageNum = 2, если да, imageData будет z.Image2.

Если imageNum не 1 или 2, imageData будет нулевым.

Это более компактный способ написания этого:

if(imageNum == 1)
   imageData = z.Image1;
else if(imageNum ==2)
   imageData = z.Image2;
else
   imageData = null;

Редактировать ? на самом деле используется в этом методе 3 различными способами. Первый описан выше. Второй int? говорит, что это значение имеет значение null. Это может быть либо null, либо int.

Третий называется Colecing, и он выглядит как imageNum = imageNum ?? 0; Это означает, что вы пытаетесь присвоить значение imageNum для imageNum, и в случае, когда imageNum равно нулю, вы получите значение по умолчанию 0.

Это более компактный способ:

if(imageNum == null)
   imageNum = 0;
0 голосов
/ 15 декабря 2011
int x = y != null : 0

Разбивается на

if (y != null)
x = y;
else
x = 0;

В переводе на английский это "

X равно y, если y не равно нулю. Если y равно нулю, x равно 0.

Вы можете упростить это, указав:

int x? = у ?? 0

0 голосов
/ 17 июня 2011

? а также ?? Разветвляющаяся логика. ? значит делать выбор между 1 и 2 1: 2. ?? по сути короткозамкнутый? Имеет смысл?

0 голосов
/ 17 июня 2011

в случае, если представление не предоставило значение для параметра imageNum; 0 будет назначен, когда ImageNum равен нулю. Если у вас есть 1, 1 будет присвоено, когда оно равно нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...