Метод контроллера (http get): необязательный параметр не равен NULL - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть простой метод Контроллера, который принимает Id и ComplexObject опционально.

Я ввожу этот метод с параметром id через URL (ниже указан код за URL), но когда яустановка точки останова внутри этого метода, тогда optionalFormData не является нулевым, но вместо этого это FormData экземпляр со всем (FirstName, SecondName, File), за исключением Id (Guid), равным нулю.

Я хочу, чтобы значение 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?

1 Ответ

0 голосов
/ 13 февраля 2019

Для привязки базовой модели Asp.Net он создает экземпляр модели во время процесса привязки и устанавливает свойства одно за другим.Вы не можете установить модель с нулевым значением, если она не указана.

Для временного решения вы можете проверить свойства модели по одному, чтобы увидеть, являются ли они значениями по умолчанию для значений, не допускающих значения NULL, и значениями 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...