Как установить значение свойства из входов View в автоматически сгенерированном частичном классе в asp.net MVC

Я работаю в первом проекте базы данных ASP.NET MVC(EF6), и у меня есть автоматически сгенерированный частичный класс в моей папке Models, например:

public partial class StdModel
{
    public string StdName { get; set; }
    public int StdNr { get; set; }
}

Поскольку это автоматически сгенерированный класс, каждый раз, когда я обновляю свои Модели (по какой-либо причине), любые изменения, сделанные в этом классе, удаляются, поэтому я расширил этот класс и хотел бы перевести некоторые входные значения, которые передаются из View в некоторые свойства (сущности) в этом новом частичном классе, например, удаление пробелов между словами.

Посмотреть:

<div class="form-group">
       @Html.LabelFor(model => model.StdName , htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.StdName , new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.StdName , "", new { @class = "text-danger" })
        </div>
</div>

Однако, поскольку это частичный класс, я не могу объявить те же свойства в этом новом частичном классе, и я уже попробовал другой подход, например, через конструктор и установить свойство с инициализатором, чтобы достичь этого, но пока безуспешно, есть ли способ установить свойства и измените, если необходимо, прежде чем он перейдет в БД следующим образом:

public partial class StdModel   <---  PartialClasses.cs 
{
    private string stdName;
    public string StdName 
    { 
      get { return stdName; }
      set { stdName = value.ToUpper(); }
    }
    private int stdNr;
    public int StdNr 
    { 
      get { return stdNr; }
      set {stdNr = Regex.Replace(value, @"\s+", ""); }
    }
}

Заранее спасибо.

2 ответа

Широко признано, что установка свойства должна быть очень простой операцией. Изменение значений в установщиках заставляет свойства возвращать неожиданные значения. Вы все еще можете сделать это - помимо частичной проблемы класса - если вы думаете, что это действительно неизбежно, но учтите, что EF также будет использовать сеттер при материализации StdModel объекты. Если в базе данных есть отклоняющееся значение, вы не заметите!

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

public string StdNameSetToUpper
{ 
  get { return StdName; }
  set { StdName = value.ToUpper(); }
}

... или (предпочтительно) работать с моделью представления, которая передает преобразованные значения между пользовательским интерфейсом и уровнем данных.

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

using System;
using System.Text.RegularExpressions;

namespace Stackru_AutoPartialPropOverriding
{
    class Program
    {
        static void Main(string[] args)
        {
            IStdModel model = new StdModel();
            Console.WriteLine($"StdName: {model.StdName}");
            Console.WriteLine($"StdNr: {model.StdNr}");
            /* StdName: steve
             * StdNr: 1
             */
            Console.ReadKey();
        }
    }

    public partial class StdModel
    {
        public string StdName { get; set; }
        public int StdNr { get; set; }
    }

    public interface IStdModel
    {
        string StdName { get; set; }
        int StdNr { get; set; }
    }

    public partial class StdModel : IStdModel
    {
        private string stdName = "steve";
        string IStdModel.StdName
        {
            get => stdName;
            set => value.ToUpper();
        }

        private int stdNr = 1;
        int IStdModel.StdNr
        {
            get => stdNr;
            set => stdNr = value; //value is already type int--not sure why you used regex
        }
    }
}

Заметки:

Другие вопросы по тегам