У меня есть приложение 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, поэтому любая помощь приветствуется, спасибо!