Подтвердить что ты не робот

{ получить; задавать; } используется в ViewModel

Я использую С# вместе с ViewModel, который передает модель представления из контроллера в представление.

В моей модели просмотра, похоже, работает так, как ожидалось, когда она передает информацию описания из представления обратно в контроллер:

    public string Description { get; set; } 

Но если у меня есть следующее, это не приведет к возврату описания. Описание показывает null

 public string Description  

Почему       { получить; задавать; }

так важно?

4b9b3361

Ответ 1

Я не знаю много о asp.net MVC/Razor, но есть существенное различие между вашими 2 образцами кода.

public string Description { get; set; }  

Создает свойство, после компиляции в классе создается сгенерированное частное поле с методами get/set, которые обращаются к полю. Свойство, объявленное с помощью {get; set;}, эквивалентно:

    private string _description;
    public string Description
    {
        get
        {
            return _description;
        }
        set
        {
            this._description = value;
        }
    }

Однако следующее:

public string Description;

Создает простое публичное поле.

Я предполагаю, что бритва использует отражение для получения значений из ViewModel и, вероятно, ищет свойство, а не поле. Таким образом, он определяет, что свойство не существует, поэтому возвращает null

Ответ 2

Синтаксис ниже - это функция языка С# "Автоматические свойства".

public string Description { get; set; }

ASP.NET MVC использует reflection и data-binding, которые работают только со свойствами, а не с переменными. Использование свойств для общего доступа - путь.

Предложите прочитать эту статью, в которой автор отказался от своей "нелюбви" к публичным свойствам.

Ответ 3

default model binder - это тот, который привязывает значения запроса к свойствам в моделях. Он связывает значения только с общедоступными свойствами get-set и даже не публичными полями.

Если вы хотите привязать значения к полям, вам нужно написать собственное связующее устройство, но публичные свойства или лучше, чем общедоступные поля, поэтому вам это не нужно.

Ответ 4

Это так называемое автоматическое свойство и по существу является сокращением для следующего (аналогичный код будет сгенерирован компилятором):

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}