Как получить переключатели ASP.NET MVC для ответа на маршрут без учета регистра или с указаний от контроллера? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть приложение ASP.NET MVC, в котором я хочу, чтобы определенная кнопка-переключатель проверялась на основе информации, предоставленной в URL.Но (и это ключевой момент ...), я хочу, чтобы была выбрана правильная кнопка-переключатель, независимо от того, указан ли параметр маршрута.

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

Мой маршрут настроен так же, как в RouteConfig:

routes.MapRoute(
                name: "LegSearch",
                url: "{controller}/{action}/{requestType}/{billNumber}/{sessionNumber}",
                defaults: new { controller = "FNSPublicSearch", action = "Search", requestType = UrlParameter.Optional, billNumber = UrlParameter.Optional, sessionNumber = UrlParameter.Optional }
            );

Действие поиска в моем контроллере выглядит следующим образом:

[HttpGet]
        public ActionResult Search(string requestType, string billNumber, string sessionNumber)
        {

            var searchModel = new SearchModel();

            string requestTypeUpperCase = null;

            if (!string.IsNullOrWhiteSpace(requestType))
            {
                requestTypeUpperCase = char.ToUpper(requestType[0]) + requestType.Substring(1);
                searchModel.RequestType = requestTypeUpperCase;
            }  

//other search-related code
}

Моя модель:

public class SearchModel : ISearchModel
    {
        [DisplayName("Session year")]
        public string SessionYear { get; set; }

        [DisplayName("Bill or initiative number")]
        public string BillNumber { get; set; }

        [DisplayName("Bill or initiative title")]

        public string BillTitle { get; set; }

        [DisplayName("Bill or initiative")]
        public string RequestType { get; set; }

        public List<ISearchResult> Results { get; set; }

        public List<string> BillNumbers { get; set; } 


        public List<SelectListItem> SessionYears { get; set; }

    }

И, наконец, вот как установлены переключателина мой взгляд:

@model FNSPublicSearch.Models.SearchModel

@using (Html.BeginForm("Search", "FNSPublicSearch", FormMethod.Post, new { id = "SearchForm" }))
{

//some other markup...


@Html.LabelFor(model => model.RequestType, new { @class = "control-label", style="margin-left: 5px"})

@Html.RadioButtonFor(model => model.RequestType, "Bill") Bill                        
@Html.RadioButtonFor(model => model.RequestType, "Initiative") Initiative
@Html.RadioButtonFor(model => model.RequestType, "Both") Both

//some more markup...
}

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

Например,

var selectedType = "@Model.RequestType";

выходит, например, как "Билл", независимо от того, подается ли "Билл" или "Билл" намаршрут.Я предполагаю, что это из-за кода, который я написал в контроллере, который должен передавать версию параметра requestType в верхнем регистре в представление.

Однако, где я запутался, это когда яdo

console.log($('input:radio[name="RequestType"]:checked').val());

вывод «Bill», когда «Bill» подается на маршрут (отлично!), но «undefined», когда я поставляю «bill» (да? что случилось с моим кодом контроллера?).

Итак, мы ожидали результата: нажатие на «{controller} / {action} / Bill / {billNumber} / {sessionNumber}» приводит к тому, что та же кнопка переключателя проверяется как «» {controller} / {action} / bill / {billNumber} / {sessionNumber} ".

Фактический результат: работает верхний регистр« Bill »в URL, который соответствует значению радиокнопки Bill, эта радиокнопка будет проверена. Строчные буквы«bill» приводит к тому, что ни одна из переключателей не проверяется, я полагаю, потому что «bill» не равен значению кнопки «Bill» (хотя я думал, что я учел это в контроллере).

IЯ новичок в MVC, поэтому любая помощь приветствуется, спасибо!

1 Ответ

0 голосов
/ 12 июля 2019

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

Я добавил новое свойство модели:

public string TypeRadio { get; set; }

Затем я изменил контроллер, чтобы установить это свойство с другим именем на основе исходного параметра маршрута:

[HttpGet]
        public ActionResult Search(string requestType, string billNumber, string sessionNumber)
        {
            var searchModel = new SearchModel();

            string requestTypeLowerCase = string.Empty;

            if (!string.IsNullOrWhiteSpace(requestType))
            {
                requestTypeLowerCase = requestType.ToLower();
                searchModel.RequestType = requestTypeLowerCase;
                searchModel.TypeRadio = requestTypeLowerCase;
            } 
//etc...
}

Затем я привязал свои переключатели к этому новому свойству с другим именем:

@Html.RadioButtonFor(model => model.TypeRadio, "bill") Bill                        
@Html.RadioButtonFor(model => model.TypeRadio, "initiative") Initiative
@Html.RadioButtonFor(model => model.TypeRadio, "both") Both

Оставил маршрут таким же, и все заработало, так как (наверное?) Теперь имена переключателей не имеют ничего общего с параметрами маршрута.

Спасибо за поиск, но, безусловно, не стесняйтесь просветить меня, если вы знаете, почему мой оригинальный код не работает!

...