ASP.NET Core MVC Ajax无法正确传值,选中地址ID返回0怎么解决?
问题根因
- 按钮
data-url属性是页面首次渲染时由服务端生成的,此时selectedShippingAddress.IntShippingAddressId初始值为0,用户后续修改下拉框选中值不会更新这个静态的url参数。 - 表单序列化后生成的字段名为
selectedShippingAddress.IntShippingAddressId,但CheckoutChanges接口接收的参数名为intShippingAddressID,二者名称不匹配,ASP.NET Core模型绑定无法将值映射到接口参数,因此接口拿到的永远是int类型的默认值0。 CheckoutChanges方法的逻辑存在问题:就算拿到了正确的地址ID,你也没有把传入的ID赋值给缓存中的模型,直接用模型原有值查询,依然无法正确更新缓存的地址信息。
修复步骤
第一步:修正接口参数和逻辑
调整CheckoutChanges方法,直接接收表单序列化后的模型,同时更新缓存逻辑:
[HttpGet] public ActionResult CheckoutChanges(CheckoutModel model) { int addressId = model.selectedShippingAddress.IntShippingAddressId; if (addressId == 0) return View(); bool AlreadyExists = memoryCache.TryGetValue<CheckoutModel>("CachedModel", out var cachedModel); if (AlreadyExists) { // 用传入的地址ID查询地址信息,更新缓存模型 cachedModel.selectedShippingAddress = context.TwebShippingAddresses.FirstOrDefault(x => x.IntShippingAddressId == addressId); var cachEntryOptions = new MemoryCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromSeconds(20)); memoryCache.Set("CachedModel", cachedModel, cachEntryOptions); } return View(); }
第二步:移除按钮data-url里的冗余参数
data-url不需要拼接静态的地址ID,表单序列化已经会传递当前选中的地址值:
<button type="button" class="btn btn-primary" data-ajax-method="get" data-toggle="ajax-modal" data-target="#ValidateAddress" data-url="@Url.Action("CheckoutChanges")">Verify Address</button>
可选简化方案
如果不需要序列化全量表单,也可以在js里动态获取下拉框当前选中值拼接url,省略表单序列化逻辑:
$(function () { $('button[data-toggle="ajax-modal"]').click(function (event) { event.preventDefault(); var selectVal = $('select[name="selectedShippingAddress.IntShippingAddressId"]').val(); var url = '@Url.Action("CheckoutChanges")?intShippingAddressID=' + selectVal; $.get(url).done(function (data) { PlaceHolderElement.html(data); }) }) })
内容的提问来源于stack exchange,提问作者Scott Uphus
相关产品推荐
相关产品推荐

