Можно ли принимать только определенное значение параметра маршрута, используя атрибут маршрута?

Следующий код делает то, что я хочу сделать. Если строковый параметр ForSaleOrRent имеет любое значение, кроме ForSale или ForRent, метод действия возвращает HttpNotFoundResult. Мой вопрос: это выполнимо, используя только атрибут Route?

[Route("post/{ForSaleOrRent}")]
public ActionResult PostProperty(string ForSaleOrRent)
{
    bool IsValidUrl = ForSaleOrRent.ToUpper() == "FORSALE" || 
                      ForSaleOrRent.ToUpper() == "FORRENT";
    if (!IsValidUrl)
    {
        return new HttpNotFoundResult();
    }
    return View(ForSaleOrRent);
}

person Amit Hasan    schedule 01.06.2016    source источник
comment
Разве использование двух разных функций, отображающих конкретный адрес, не решит вашу проблему?   -  person Phil1970    schedule 01.06.2016
comment
@Phil1970 приведенный выше код тоже работает, но я хотел бы знать, можно ли это сделать с помощью атрибута маршрута.   -  person Amit Hasan    schedule 01.06.2016
comment
Почему бы не использовать enum в первую очередь?   -  person haim770    schedule 01.06.2016
comment
@ haim770 ты гений.   -  person Amit Hasan    schedule 01.06.2016
comment
@ haim770 Я только что проверил его с enum, но он принимает целые числа, а также продажу и аренду.   -  person Amit Hasan    schedule 01.06.2016
comment
@AmitHasan, обычно в MVC проверка модели выполняется как часть процесса определения модели. Таким образом, если вы напишете собственный модуль связывания модели для своего типа enum, вы сможете пометить его как недопустимый для любого значения, которое не соответствует FORSALE или FORRENT (например). Если вы чувствуете, что это правильный путь, я напишу ответ с кодом.   -  person haim770    schedule 01.06.2016
comment
@ haim770 Большое спасибо за информацию. Я не знал этого раньше. Я посмотрю на это в ближайшее время.   -  person Amit Hasan    schedule 01.06.2016


Ответы (1)


Просто используйте встроенное ограничение

[Route("post/{ForSaleOrRent:regex(^forrent$|^forsale$)}")]
public ActionResult PostProperty(string ForSaleOrRent)
{
    return View(ForSaleOrRent);
}

Использованная литература:

person NightOwl888    schedule 01.06.2016
comment
Даст ли это мне ценность ForSaleOrRent? - person Amit Hasan; 01.06.2016
comment
Я только что протестировал его, и он показывает ошибку. Встроенный преобразователь ограничений типа «DefaultInlineConstraintResolver» не смог разрешить следующее встроенное ограничение: «значения (для аренды | для продажи)». - person Amit Hasan; 01.06.2016
comment
Я не был в этом уверен. В сообщении говорится, что маршрутизация атрибутов ранее предлагала настраиваемые встроенные ограничения, подобные этому, но не давала никаких указаний, как они были изменены. Я нашел вторую ссылку выше и исправил ограничение. В качестве альтернативы вы можете использовать ValuesConstraint из 2-й ссылки (см. раздел «Пользовательские ограничения маршрута»). - person NightOwl888; 01.06.2016
comment
как также игнорировать регистр? - person Bart Calixto; 19.09.2019