Как установить значение свойства из входов 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
}
}
}
Заметки:
- Предоставленный код скомпилирован в C# 7,.Net 4.6.1
- $ "{expression}" это интерполяция строк, добавленная в C# 6
- => член с выражением, get-C#6; Набор-C#7