Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mvc3 - валидация параметров GET-запроса, как избежать ошибки на сервере 
V
    Опции темы
fcoder
Дата 13.5.2011, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.9.2006

Репутация: нет
Всего: нет



Предположим у нас есть контроллер ProfileController у которого есть действие View. И мы хотим сделать следующее: когда мы передадим этому действию id он нам из бд должен будет показать информацию о профиле пользователя.
 
Я сделал вот такую реализацию (просто, наглядно, красиво):

Код

    public class ProfileController : Controller
    {
        //
        // GET: /Profile/

        public ActionResult View(int id)
        {
            var db = new dbManager();
            ViewBag.Profile = db.GetProfile(id);

            return View();
        }
...


В итоге мы можем строить ссылки для доступа к просмотру профилей. Например www.mysite.ru/profile/view/15 покажет профиль с id=15

Но тут есть проблема. Если мы не укажем id (www.mysite.ru/profile/view/) или укажем некорректный (www.mysite.ru/profile/view/Ыыыы) то получим Internal Server Error.  

Какие стандартные пути решения подобных ситуаций? 

Я пока что вижу только изменить метод
public ActionResult View(string id)
затем делать преобразование строки в число, ловить исключение и т.д.

Но что если у нас параметр id типа Guid например?
PM MAIL   Вверх
gambit
Дата 13.5.2011, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



int? не прокатит в этом месте??

Добавлено через 31 секунду
а, это все равно не спасет от
Цитата(fcoder @  13.5.2011,  09:53 Найти цитируемый пост)
или укажем некорректный (www.mysite.ru/profile/view/Ыыыы) 


Добавлено через 4 минуты и 36 секунд
Цитата(fcoder @  13.5.2011,  09:53 Найти цитируемый пост)
Но что если у нас параметр id типа Guid например? 

у guid тоже есть Parse и tryParse
PM MAIL ICQ Skype   Вверх
fcoder
Дата 13.5.2011, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.9.2006

Репутация: нет
Всего: нет



В общем, валидацию в каждом методе придется отдельно делать, а параметры принимать исключительно строковые.
PM MAIL   Вверх
Любитель
Дата 13.5.2011, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 5
Всего: 92





--------------------
PM MAIL ICQ Skype   Вверх
fcoder
Дата 13.5.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.9.2006

Репутация: нет
Всего: нет



Не помогает. Все-равно ругается на несоответствие типов при некорректном url :(

А если я укажу тип string в заголовке метода и буду пытаться конвертировать переданное значение в нужный тип и ловить исключение - возможно будет создать запрос, который вызовет ошибку на сервере из-за передачи этого параметра в метод контроллера?

PM MAIL   Вверх
Любитель
Дата 14.5.2011, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 5
Всего: 92



Ну, "правильный" способ - это только избавляться от того, чтоб твой урл попадал под дефолтный роут (или избавляться от дефолтного роута) и делать роут с констрейнтом. Будет 404 тогда на "плохих" урлах.


--------------------
PM MAIL ICQ Skype   Вверх
fcoder
Дата 15.5.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.9.2006

Репутация: нет
Всего: нет



Я пытался. 

Добавил маршрут в global.asax:

Код

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Profile",
                "ViewProfile/{id}", 
                new { controller = "Profile", action = "View", id = @"\d+" }
            );

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

        }


Соответственно ссылки изменились на www.mysite.ru/ViewProfile/{id}

Но когда я ввожу в адресной строке браузера www.mysite.ru/ViewProfile/ или www.mysite.ru/ViewProfile/Ааа - получаю ту же самую ошибку.

PM MAIL   Вверх
Любитель
Дата 15.5.2011, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 5
Всего: 92



Стоп. В MapRoute 3-ий параметр - это дефолтные значения. А 4-ый - констрейнты. Тебе нужно последнее. А ща у тебя \d+ - это "id" по умолчанию smile


--------------------
PM MAIL ICQ Skype   Вверх
fcoder
Дата 16.5.2011, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.9.2006

Репутация: нет
Всего: нет



Получилось, спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.