c# - 控制器的方法(http get):可选参数不为空
问题描述
我有简单的控制器方法,它接受 Id 和ComplexObject
可选的。
我正在id
通过 URL 输入带有参数的此方法(下面是 URL 后面的代码),但是当我在该方法中设置断点时,optionalFormData
它不为空,而是它是除(Guid)之外的所有 ( , , ) 的FormData
实例为空。FirstName
SecondName
File
Id
我希望optionalFormData
在未发送时为空,而不是作为具有FormData
属性null
值的实例。
伪代码:
public IActionResult MyView(Guid? id, FormData optionalFormData = null)
{
if (optionalFormData != null)
{
return View(optionalFormData);
}
return View(_context.Data.FirstOrDefault(x => x.Id == id.Value));
}
public class FormData
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public File File { get; set; }
}
@Html.ActionLink("Enter MyView", "MyView", "MyController", new { id = Model?.Id })
我试过做FormData? optionalFormData
,但它需要 C# 8.0
我怎么能在 7.x 上做到这一点?
解决方案
对于 Asp.Net Core Model Binding,它会在绑定过程中创建模型实例,并一一设置属性。如果未提供,则无法将模型设置为 null。
对于解决方法,您可以一一检查模型属性,以查看它们是否为不可空值的默认值和可空值的空值。
尝试
public static class Extensions
{
public static bool IsNullOrDefault(this object obj)
{
if (Object.ReferenceEquals(obj, null))
return true;
return obj.GetType().GetProperties()
.All(x => IsNullOrEmpty(x.GetValue(obj)));
}
private static bool IsNullOrEmpty(object value)
{
if (Object.ReferenceEquals(value, null))
return true;
var type = value.GetType();
return type.IsValueType
&& Object.Equals(value, Activator.CreateInstance(type));
}
}
并使用如下:
public IActionResult MyView(Guid? id, FormData optionalFormData = null)
{
if (!optionalFormData.IsNullOrDefault())
{
return View(optionalFormData);
}
return View(_context.Data.FirstOrDefault(x => x.Id == id.Value));
}
推荐阅读
- javascript - 递归数组问题
- angular - 英雄之旅 - 步骤 8/HTTP - 内存中 webapi 返回未定义
- c# - C# 更新带有绑定到它的队列的绘图图表
- angularjs - 无法理解 angularjs 组件。之前只使用过指令
- android - Room 中的对象大小限制
- android - 如何从启动画面中隐藏操作栏?
- php - 只能循环一次 SQL 行?
- python - 为了解释两个论点的命题逻辑
- javascript - 通过 javascript 在 window.selection() 中查找 html 标签
- html - 无法让水平 scoll 菜单在 HTML 中工作