我有一个 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";
例如,无论向路由提供“Bill”还是“bill”,都以“Bill”形式出现。我假设这是由于我在控制器中编写的代码,它应该将 requestType 参数的大写版本传递给视图。
然而,我感到困惑的地方是当我这样做的时候
console.log($('input:radio[name="RequestType"]:checked').val());
当向路由提供“Bill”时输出为“Bill”(太棒了!),但当我提供“bill”时输出为“未定义”(嗯?我的控制器代码发生了什么?)。
所以,我们得到了预期的结果:点击“{controller}/{action}/Bill/{billNumber}/{sessionNumber}”会导致同一个单选按钮被选中为“”{controller}/{action}/bill/{billNumber }/{会话编号}”。
实际结果:URL 中的大写“Bill”,与 Bill 单选按钮的值匹配,有效;该单选按钮将被选中。小写的“bill”不会检查任何单选按钮,我猜是因为“bill”不等于按钮的“Bill”值(尽管我认为我在控制器中考虑了这一点)。
我对 MVC 相当陌生,因此感谢您的帮助,谢谢!