0

我有一个 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 相当陌生,因此感谢您的帮助,谢谢!

4

1 回答 1

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

让路线保持不变,一切正常,因为(我猜?)现在单选按钮名称与路线参数无关。

感谢您的关注,但如果您知道为什么我的原始代码不起作用,请务必给我启发!

于 2019-07-11T22:13:27.160 回答