Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > mvc3 - валидация параметров GET-запроса


Автор: fcoder 13.5.2011, 09:53
Предположим у нас есть контроллер 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 например?

Автор: gambit 13.5.2011, 09:56
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

Автор: fcoder 13.5.2011, 10:40
В общем, валидацию в каждом методе придется отдельно делать, а параметры принимать исключительно строковые.

Автор: Любитель 13.5.2011, 11:22
http://www.asp.net/mvc/tutorials/creating-a-route-constraint-cs

Автор: fcoder 13.5.2011, 12:20
Не помогает. Все-равно ругается на несоответствие типов при некорректном url :(

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

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

Автор: fcoder 15.5.2011, 11:15
Я пытался. 

Добавил маршрут в 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/Ааа - получаю ту же самую ошибку.

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

Автор: fcoder 16.5.2011, 08:49
Получилось, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)