我有一个简单的Controller方法,可以选择接受ID和一个ComplexObject
。
我正在通过URL使用id
参数输入此方法(下面是URL后面的代码),但是当我在该方法中设置断点时,optionalFormData
并不为空,而是它是FormData
实例,其中所有内容(FirstName
,SecondName
,File
除外,Id
(Guid)为空。
我希望optionalFormData
在不发送时为空,而不是具有属性FormData
的{{1}}实例。
伪代码:
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 })
,但它需要C#8.0
我怎么在7.x上做到这一点?
答案 0 :(得分:1)
对于Asp.Net核心模型绑定,它将在绑定过程中创建模型实例,并逐一设置属性。如果未提供该模型,则无法将其设置为null。
要解决此问题,您可以逐一检查模型属性,以查看它们是否为非空值的默认值和为空值的值是否为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));
}