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

时间:2017-08-24 23:46:09

标签: c# asp.net-mvc properties entity-framework-6 partial-classes

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

然而,因为它是一个部分类,我不能在这个新的分部类中声明相同的属性,我已经尝试过不同的方法,比如通过构造函数和set属性和初始化器来实现这个但是没有成功,有没有办法设置属性,并在它进入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+", ""); }
    }
}

提前致谢。

2 个答案:

答案 0 :(得分:0)

可能的,可能接受的解决方法可能是明确实现接口。例如:

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

注意:

答案 1 :(得分:0)

人们普遍认为,设置属性应该是一个非常简单的操作。更改setter中的值会使属性返回意外值。你仍然可以这样做 - 除了部分类问题 - 如果你认为这是不可避免的,但请注意EF在实现sudo apt-get install php-mbstring sudo service apache2 restart 对象时也会使用setter。如果数据库中存在偏差值,您将不会注意到!

考虑到所有这一点,我要么创建两个委托属性,将值转换为映射属性,例如......

StdModel

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