RedirectToAction () против View () и троичных операторов? - PullRequest
6 голосов
/ 28 января 2011

при принятии решения о том, какой ActionResult следует возвращать из действия контроллера, я решил использовать троичные операторы, а не более длинные if-else. Вот моя проблема ...

этот код работает

return
    ModelState.IsValid ?
    (ActionResult) RedirectToAction("Edit", new { id = id }) :
    View(new EditViewModel(updatedCategory));

но это не

return 
     ModelState.IsValid ?
     RedirectToAction("Edit", new { id = id }) :
     View(new EditViewModel(updatedCategory));

Мне бы не пришлось выполнять явное приведение, если бы использовали if-else. Кроме того, RedirectToAction () и View () возвращают производную ActionResult.

Мне нравится краткость этого кода, но это приведение не кажется правильным. Может ли кто-нибудь просветить меня?

Хотя я уверен, что это очевидно, EditViewModel является моделью представления для моего действия Edit, а updatedCategory является объектом EF4. Но я не думаю, что это имеет отношение к проблеме.

хорошо ... Я только что понял, что то, что я делал, не нужно, потому что независимо от того, что я возвращаюсь к действию Edit с updatedCategory, мне не нужно проверять, что Модель действительна Мне все еще интересно узнать ответ на вопрос, может ли кто-нибудь помочь.

Ответы [ 2 ]

9 голосов
/ 28 января 2011

Я полагаю, это потому, что аргументы при использовании оператора?: Должны быть конвертируемыми между собой, например, в состоянии ? x: y вы должны иметь возможность преобразовать x в y или y в x. Тогда тип результата является наименее специфичным из двух. Таким образом, если бы x был объектом, а y строкой, то вы можете привести строку к объекту, и результат будет иметь тип object.

В вашем примере x является RedirectToRouteResult, а y является ViewResult. Вы не можете преобразовать RedirectToRouteResult в ViewResult или наоборот. Вы можете преобразовать их оба в ActionResult, однако, поэтому, если вы приведете к ActionResult, он работает - тип x будет затем ActionResult, y может быть преобразован в ActionResult, и общий результат будет Тип ActionResult.

Надеюсь, я все правильно объяснил ... Боюсь, я не знаю точную семантику оператора?: Так как сам редко его использую ...

0 голосов
/ 19 марта 2014

Типы данных должны быть точно такими же в переменной присваивания, и оба типа возвращаемых данных здесь - самый простой пример, который я могу себе представить:

int originalValue = 10;
int? value = (originalValue != 10) ? null : originalValue;

//Which is very easily fixed with type casting as you have done

int? value = (originalValue != 10) ? null : (int?)originalValue;
...