如何获得ASP.NET MVC单选按钮以响应不区分大小写的路由或来自控制器的指示?

时间:2019-07-11 19:51:23

标签: c# asp.net-mvc razor radiobuttonfor mvcroutehandler

我有一个ASP.NET MVC应用程序,我希望根据URL中提供的信息检查某个单选按钮。但是(这是关键...),无论提供的route参数如何,我都希望检查右单选按钮。

我想我可以用控制器中的一些代码轻松地做到这一点,该代码可以采用任何情况下的route参数并将其转换为大写形式(以匹配分配给单选按钮的值),但是到目前为止我一直没有成功(并且发现了一些使我怀疑我不完全知道如何将模型信息提供给视图的东西)。

我的路线在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”时输出为“ undefined”(呵呵,我的控制器代码发生了什么?)。

因此,我们获得了预期的结果:按下“ {controller} / {action} / Bill / {billNumber} / {sessionNumber}”会导致同一单选按钮被选中为“” {controller} / {action} / bill / {billNumber} / {sessionNumber}”。

实际结果:URL中与“ Bill”单选按钮的值匹配的大写“ Bill”起作用;该单选按钮将被选中。小写的“ bill”不会检查任何单选按钮,我想是因为“ bill”不等于按钮的“ Bill”值(即使我以为我在控制器中考虑了这一点)。

我对MVC还是很陌生,感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

好吧,我想出了一个解决方案,但是我觉得它很hacky。我更希望有人知道在我发布的原始方案中这些单选按钮如何真正接收模型信息,但是无论如何...

我添加了一个新的模型属性:

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

使路线保持相同,并且一切正常,因为(我想是吗?)现在单选按钮名称与路线参数无关。

感谢您的关注,但是如果您知道我的原始代码为什么行不通的话,一定可以启发我!