Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
1

Как сделать обязательным параметр в действии конкретного контроллера?

12.06.2018, 14:08. Показов 797. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет!

Есть чистое MVC 5 приложение.
Там есть маршрут по умолчанию:

C#
1
2
3
4
5
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Я хочу в своем контроллере в конкретном действии сделать обязательный сторовый параметр.

C#
1
2
3
4
5
public JsonResult Test(string data)
{
    ...
    return Json(result);
}
Метод должен принимать json строку и возвращать, соответственно, тоже. Параметр data должен обязательно передаваться.

Я пробовал добавлять новый маршрут, под это конкретнее действие. Но если я не указываю параметр data, то срабатывает маршрут по умолчанию и в итоге действие вызывается с пустым параметром data. Но маршрут Default убирать не хочется, т.к. он работает для других запросов.

Пробовал играться с атрибутом Route. В RouteConfig прописал routes.MapMvcAttributeRoutes() и к своему действию добавил [Route("{data:regex(^{.+}$)}")]. Но действие вызывается и без указания параметра и с указанием параметра со значением, например, 5. Если же, например, сделать вот так:

C#
1
2
3
4
5
6
[Route("{data:int}}")]
public JsonResult Test(int data)
{
    ...
    return Json(result);
}
То действие можно вызвать только с указанием параметра data, причем он должен быть именно целым числом.

Можно, конечно, прямо в действии проверить заполненность параметра и выдавать исключение, но интересно есть ли какой-то более гуманный способ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2018, 14:08
Ответы с готовыми решениями:

Как сделать обязательным 1 поле из нескольких
Здравствуйте! У меня ситуация такая: в форме, помимо всего прочего, есть 5 полей со списком (ну...

Как сделать поля обязательным для заполнения
Здравствуйте. Возникла необходимость в учетных данных пользователя сделать поле "телефон"...

Как в Yii сделать поле fileField обязательным?
Добрый день, такая проблема. Есть модель Slider с текстовыми свойствами и с внешним ключом на...

Как сделать обязательным выбор одного из элементов ComboBox
У меня есть выпадающий список. Нужно сделать обязательным выбор одного из элементов этого...

2
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
12.06.2018, 18:46 2
V0fka, не претендую на истину (сам с MVC пока не очень), но вот так попробуйте.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Mvc.Filters;
 
namespace WebApplication2
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes) {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
 
            routes.MapRoute("String", "StringIndex/{data}",
                new { controller = "Home", action = "StringIndex" },
                new { name = new StringConstraints() });
 
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
    class StringConstraints : IRouteConstraint {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) {
            return values[parameterName].GetType() == typeof(string);
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace WebApplication2.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            return Content("Common Index!");
        }
        public ActionResult StringIndex(string data) {
            return Content(data);
        }
    }
}
0
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
13.06.2018, 10:35  [ТС] 3
insite2012, спасибо за ответ! Ваш вариант работает (правда поправил эту строку new { name = new StringConstraints() } на new { data = new StringConstraints() }). Но, на мой взгляд, лучше тогда прямо в действии проверить заполненность параметра, оно так намного проще выглядит.
0
13.06.2018, 10:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2018, 10:35
Помогаю со студенческими работами здесь

Как в форме заказа поле "телефон" сделать обязательным для заполнения?
Добрый день! Собственно, вопрос в названии темы. В каком шаблоне это менять? Слышал про атрибут...

Как сделать update конкретного пользователя в бд?
Всем привет! Скажу сразу, что я в mysql новичок. Вопрос: Как сделать update конкретного...

Параметр контроллера всегда null
Доброго времени суток. Вопрос банальный, как мне кажется, но почему то у меня это не работает......

Как поменять цвет конкретного элемента или конкретного столбца матрицы?
Как поменять цвет матрицы конкретного элемента или конкретного столбца . Пример , какие элементы...

Как сделать функцию, выводящую массив значений при действии на массив аргументов?
Пусть у нас в таблице exel есть массивы в 2 столбцах, скажем данные находятся в ячейках A1 :A3 и...

Сделать checkbox обязательным для заполнения?
<label class="pol_f1"><input type="checkbox" /> Я согласен с <span> <a...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru