控制器的方法(http get):可选参数不为null

时间:2019-02-12 11:38:39

标签: c# asp.net-core asp.net-core-mvc

我有一个简单的Controller方法,可以选择接受ID和一个ComplexObject

我正在通过URL使用id参数输入此方法(下面是URL后面的代码),但是当我在该方法中设置断点时,optionalFormData并不为空,而是它是FormData实例,其中所有内容(FirstNameSecondNameFile除外,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上做到这一点?

1 个答案:

答案 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));
}