簡體   English   中英

如何在asp.net MVC中自動生成的部分類中的View的iputs中設置屬性的值

[英]How to set value of a property from iputs of View in auto generated partial class in 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>

但是,因為它是一個局部類,所以我不能在這個新的局部類中聲明相同的屬性,而且我已經嘗試了不同的方法,例如通過構造函數和帶有初始化器的set屬性來實現此目的,但沒有成功,有沒有辦法設置屬性並在進入數據庫之前按需要進行更改,如下所示:

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

筆記:

設置屬性應該是非常簡單的操作,這一點已被廣泛接受。 在setter中更改值會使屬性返回意外值。 如果您認為這確實是不可避免的,那么除了部分類問題之外,您仍然可以執行此操作,但是請注意,EF在實現StdModel對象時也會使用setter。 如果數據庫中存在異常值,您將不會注意到!

考慮到所有這些,我將創建兩個委托屬性,將值轉換為映射的屬性,例如...

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

...或(最好)與視圖模型一起使用,該視圖模型在UI和數據層之間傳輸轉換后的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM