我有一个 ASP.NET MVC应用程序,其中我希望根据URL中提供的信息检查某个单选按钮。但是(这是关键...),无论提供的路由参数的大小写如何,我都希望检查正确的单选按钮。
我以为我可以通过控制器中的一些代码轻松做到这一点,这些代码将采用任何情况的路由参数并将其转换为始终大写(以匹配分配给单选按钮的值),但到目前为止我没有成功(并且发现了一些让我怀疑的事情我不确切地知道模型信息是如何提供给我的视图的)。
我的路由在路由配置中是这样设置的:
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 参数的大写版本传递给视图。
不过,我感到困惑的地方是当我这样做的时候
console.log($('input:radio[name="RequestType"]:checked').val());
当"账单">提供给路由时,输出是"比尔"(太好了!),但当我提供"账单"时,输出是"未定义"(嗯? 我的控制器代码发生了什么变化?
因此,我们有预期的结果:点击"{controller}/{action}/Bill/{billNumber}/{sessionNumber}"会导致相同的单选按钮被检查为"{controller}/{action}/bill/{billNumber}/{sessionNumber}"。
实际结果:URL 中的大写"Bill"与 Bill 单选按钮的值匹配,有效;将选中该单选按钮。小写的"bill"会导致没有检查任何单选按钮,我猜是因为"bill"不等于按钮的"Bill"值(即使我认为我在控制器中考虑到了这一点)。
我对 MVC 相当陌生,所以任何帮助都值得赞赏,谢谢!
好吧,我想出了一个解决方案,但我觉得它很笨拙。 我更希望有人知道解释这些单选按钮在我发布的原始场景中如何真正接收模型信息,但无论如何......
我添加了一个新的模型属性:
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
保持路线不变,一切正常,因为(我猜?)现在单选按钮名称与路由参数无关。
感谢您的查看,但如果您知道为什么我的原始代码不起作用,请随时启发我!