【问题标题】:How to set value of a property from iputs of View in auto generated partial class in asp.net MVC如何在asp.net MVC中自动生成的部分类中从View的输入中设置属性的值
【发布时间】:2017-08-24 23:46:09
【问题描述】:

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

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>

但是,因为它是一个部分类,所以我不能在这个新的部分类中声明相同的属性,并且我已经尝试了不同的方法,例如通过构造函数和使用初始化程序设置属性来实现这一点,但没有成功,有什么方法可以在进入数据库之前设置属性并根据需要进行更改,如下所示:

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    注意事项:

    【讨论】:

    • 正如我提到的我在 MVC 环境中使用它,所以我的视图看起来像这样:@Html.EditorFor(model => model.StdName, new { htmlAttributes = new { @class= "form -控制" } })
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这样我必须在视图的不同部分而不是模型中的一个属性中进行更改。无论如何,我认为我需要重新评估我的选择并采取不同的方法。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多