如何在 MVC 中自动生成的分部类中从视图 asp.net iput 中设置属性的值



我正在一个 ASP.NET 的 MVC(EF6( 数据库第一个项目中工作,我的 Models 文件夹中有一个自动生成的部分类,如下所示:

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

因为这是一个自动生成的类,所以每次我刷新我的模型(无论出于何种原因(时,对这个类所做的任何更改都会被删除,所以我扩展了这个类,我想处理一些从视图传递到这个新分部类中的一些属性(实体(的输入值,例如删除单词之间的空格。

视图:

<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>

但是,因为它是一个分部类,我无法在这个新的分部类中声明相同的属性,并且我已经尝试了不同的方法,例如通过构造函数并使用初始值设定项设置属性来实现这一点,但没有成功,有没有办法设置属性并根据需要进行更改,然后转到 db,如下所示:

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+", ""); }
}
}

提前谢谢。

一种可能的、可能可接受的解决方法可能是显式实现接口。例:

using System;
using System.Text.RegularExpressions;
namespace StackOverflow_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; set-C#7

人们普遍认为,设置属性应该是一个非常简单的操作。更改资源库中的值会使属性返回意外的值。除了偏部类问题之外,如果您认为这确实是不可避免的,您仍然可以这样做,但请注意,EF 在具体化对象时也会使用 setterStdModel。如果数据库中存在偏差值,您不会注意到!

考虑到所有这些,我会创建两个委托属性,将值转换为映射的属性,例如......

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

。或者(最好(使用在 UI 和数据层之间传输转换值的视图模型。

最新更新