使用Url.Action向控制器传值时出现空值问题求助
问题根源
你在视图生成请求URL时,传递的是Section、Province这类顶级参数名,但控制器Action接收的是AreaVM类型的对象参数。ASP.NET Core的默认模型绑定规则会寻找area.Section这种格式的参数(对应对象的属性路径),所以直接传顶级参数无法匹配到AreaVM的属性,导致参数全为空。另外你原代码里的area = "Province"会和AreaVM area参数重名,也会干扰绑定。
修复方法
方法1:调整URL参数命名,匹配模型绑定规则
把参数改成area.Section、area.Province的格式,同时把冲突的area参数改名(比如areaType):
var _getDocumentsUrl = '@Html.Raw(@Url.Action("GetDocuments", "Document", new { area = new { Section = "0", Province = "1", County = "0", District = "0" }, areaType = "Province" }))';
生成后的URL会包含?area.Section=0&area.Province=1这类参数,模型绑定就能正确把值赋值给AreaVM的属性。
方法2:修改Action参数,适配现有URL格式
如果不想改URL,可以给Action参数加上[FromQuery]特性,让模型绑定直接从查询字符串中匹配属性名:
public IActionResult GetDocuments([FromQuery] AreaVM area, string areaType) { // 代码逻辑 }
或者直接把属性拆成单独参数,手动组装模型:
public IActionResult GetDocuments(string? Section, string? Province, string? County, string? District, string area) { var areaVM = new AreaVM { Section = Section, Province = Province, County = County, District = District }; // 代码逻辑 }
方法3:排查路由配置(额外检查)
如果项目有自定义路由模板,确认路由中没有定义和Section、Province同名的路由参数,否则会优先匹配路由参数,导致查询字符串的参数无法绑定到模型。
验证步骤
生成URL后,在浏览器控制台打印_getDocumentsUrl,查看最终URL的查询参数是否符合预期。比如使用方法1后,URL应该类似:/Document/GetDocuments?area.Section=0&area.Province=1&area.County=0&area.District=0&areaType=Province
内容的提问来源于stack exchange,提问作者hrmsystem

