Saya mencoba mengikat tipe kompleks ke properti untuk mengedit nilai properti dan menyimpan perubahan dalam memori, untuk saat ini untuk pengujian.

I get an exception when I execute Post. 

Ini adalah tampilan Edit pisau cukur saya.

<h1>Edit:</h1>






        <form method="post">




        <label asp-for="EditClient.Name"> </label>
        <input asp-for="EditClient.Name"
               class="form-control"
               readonly="readonly" />



        <h3 class="text text-info">Pull Configuration</h3>
        <div>

            <label asp-for="EditClient.Pull.Protocol"> </label>
            <input asp-for="EditClient.Pull.Protocol" class="form-control" />
            <span asp-validation-for="EditClient.Pull.Protocol" class="text-danger"></span>

            <label asp-for="EditClient.Pull.Host"> </label>
            <input asp-for="EditClient.Pull.Host" class="form-control" />
            <span asp-validation-for="EditClient.Pull.Host" class="text-danger"></span>


            <label asp-for="EditClient.Pull.User"> </label>
            <input asp-for="EditClient.Pull.User" class="form-control" />
            <span asp-validation-for="EditClient.Pull.User" class="text-danger"></span>

            <label asp-for="EditClient.Pull.Password"> </label>
            <input asp-for="EditClient.Pull.Password" class="form-control" />
            <span asp-validation-for="EditClient.Pull.Password" class="text-danger"></span>


            <label asp-for="EditClient.Pull.PrivateKeyPath"> </label>
            <input asp-for="EditClient.Pull.PrivateKeyPath" class="form-control" />
            <span asp-validation-for="EditClient.Pull.PrivateKeyPath" class="text-danger"></span>

            <label asp-for="EditClient.Pull.Port"> </label>
            <input asp-for="EditClient.Pull.Port" class="form-control" />
            <span asp-validation-for="EditClient.Pull.Port" class="text-danger"></span>


            <label asp-for="EditClient.Pull.RemoteDirectory"> </label>
            <input asp-for="EditClient.Pull.RemoteDirectory" class="form-control" />
            <span asp-validation-for="EditClient.Pull.RemoteDirectory" class="text-danger"></span>


            <label asp-for="EditClient.Pull.IsDecrypt"> </label>
            <input asp-for="EditClient.Pull.IsDecrypt" class="form-control" />
            <span asp-validation-for="EditClient.Pull.IsDecrypt" class="text-danger"></span>



        </div>


        <h3 class="text text-info">Push Configuration</h3>
        <label asp-for="EditClient.Push.Protocol"> </label>
        <input asp-for="EditClient.Push.Protocol" class="form-control" />
        <span asp-validation-for="EditClient.Push.Protocol" class="text-danger"></span>

        <label asp-for="EditClient.Push.Host"> </label>
        <input asp-for="EditClient.Push.Host" class="form-control" />
        <span asp-validation-for="EditClient.Push.Host" class="text-danger"></span>


        <label asp-for="EditClient.Push.User"> </label>
        <input asp-for="EditClient.Push.User" class="form-control" />
        <span asp-validation-for="EditClient.Pull.User" class="text-danger"></span>

        <label asp-for="EditClient.Push.Password"> </label>
        <input asp-for="EditClient.Push.Password" class="form-control" />
        <span asp-validation-for="EditClient.Pull.Password" class="text-danger"></span>


        <label asp-for="EditClient.Push.PrivateKeyPath"> </label>
        <input asp-for="EditClient.Push.PrivateKeyPath" class="form-control" />
        <span asp-validation-for="EditClient.Pull.PrivateKeyPath" class="text-danger"></span>

        <label asp-for="EditClient.Push.Port"> </label>
        <input asp-for="EditClient.Push.Port" class="form-control" />
        <span asp-validation-for="EditClient.Pull.Port" class="text-danger"></span>


        <label asp-for="EditClient.Push.RemoteDirectory"> </label>
        <input asp-for="EditClient.Push.RemoteDirectory" class="form-control" />
        <span asp-validation-for="EditClient.Pull.RemoteDirectory" class="text-danger"></span>

        <label asp-for="EditClient.Push.IsZip"> </label>
        <input asp-for="EditClient.Push.IsZip" class="form-control" />
        <span asp-validation-for="EditClient.Push.IsZip" class="text-danger"></span>



        <label asp-for="EditClient.Push.IsEncrypt"> </label>
        <input asp-for="EditClient.Push.IsEncrypt" class="form-control" />
        <span asp-validation-for="EditClient.Push.IsEncrypt" class="text-danger"></span>

        <button type="submit">
            Submit
        </button>
    </form>







    This is my EditModel
    ``````````````````````````````````````````````````

    public class EditModel : PageModel
        {
            private readonly IClientConfiguration _config;



            [BindProperty(SupportsGet = false)]
            public ClientConfig EditClient { get; set; } 





            public EditModel(IClientConfiguration config)
            {
                this._config = config;

            }


            public IActionResult OnPost()
            {
                var _editedClient = 
                    new ClientConfig(this.EditClient.Name, this.EditClient.Email, this.EditClient.Push, this.EditClient.Pull);


                if(this._config.GetByName(_editedClient.Name) == null)
                {
                    this._config.Add(_editedClient);
                }
                else
                {
                    this._config.Edit(_editedClient);
                }

                return this.RedirectToPage("/DropBox/Detail", new { name = _editedClient.Name }); 
            }
            public IActionResult OnGet(string name)
            {
                this.EditClient = this._config.GetByName(name);


                return this.Page();
            }
        }









    This is my type
    ```````````````````````````````````````````````````````````
    [JsonObject]
        public class ClientConfig
        {

            [JsonProperty]
            public string Name { get; }

            [JsonProperty]
            public IEnumerable<string> Email { get; }


            [JsonProperty]
            public PushConfig Push { get; }

            [JsonProperty]
            public PullConfig Pull { get; }



            [JsonConstructor]
            public ClientConfig(string name, IEnumerable<string> email, PushConfig push, PullConfig pull)
            {
                this.Name = name;
                this.Email = email;
                this.Push = push;
                this.Pull = pull;
            }






        }


    This is my IClientConfig Interface and the class who implements it
    `````````````````````````````````````````````````````````````````````

     public class InMemoryClientConfig : IClientConfiguration
        {
            public List<ClientConfig> GetAll()
            {
                return this.LoadClientsConfig().Clients
                    .ToList();
            }
            public ClientConfig Add(ClientConfig clientConfig)
            {
                var allClients = this.GetAll();

                var exist = allClients.Contains(clientConfig);

                if(!exist)
                {
                    this.GetAll().Add(clientConfig);

                    return clientConfig;
                }

                return clientConfig; 


            }

            public ClientConfig Edit(ClientConfig clientConfig)
            {
                var _edit = this.GetByName(clientConfig.Name); 


                if (_edit != null)
                this.GetAll().Remove(_edit);

                this.GetAll()
                    .Add(new ClientConfig(clientConfig.Name, clientConfig.Email, clientConfig.Push, clientConfig.Pull));
                return clientConfig;
            }


            public ClientConfig Delete(int id)
            {
                throw new NotImplementedException();
            }



            Config LoadClientsConfig()
            {
                var deserialize = File.ReadAllText(@"C:\...\Path\ToJsonFile");
                return JsonConvert.DeserializeObject<Config>(deserialize);
            }
            public ClientConfig GetByName(string name)
            => this.GetAll
                     ().SingleOrDefault(x => x.Name == name);
        }






Anak masalah berasal dari Properti EditClient ClientConfig yang terletak di baris kelas EditModel: PageModel #18.

Get berfungsi dengan baik tetapi ketika saya mencoba memposting perubahan yang dibuat pada halaman formulir saya mendapatkan InvalidOperationException Tidak dapat membuat turunan dari tipe 'ProjectName.Core.ClientConfig Model terikat tipe kompleks tidak boleh abstrak atau tipe nilai dan harus memiliki konstruktor tanpa parameter. Atau, berikan parameter 'EditClient' nilai default non-null.

Saya telah terjebak dalam hal ini selama sekitar satu hari dan meninjau tumpukan pertanyaan lainnya dengan jawaban tetapi saya tidak mengerti jawaban yang diberikan, terminologi atau contoh.

Maaf jika saya tidak menjelaskan pertanyaan saya, tetapi ini adalah yang terbaik dari kemampuan saya.

Bantuan apa pun akan sangat dihargai.

Terima kasih lagi.

2
Ahhzeee 19 September 2019, 21:52

1 menjawab

Jawaban Terbaik

Akhirnya ketahuan.

Lakukan hal berikut, 1. Pastikan nama label Anda cocok dengan properti yang ingin Anda ikat. "

  1. Membebani konstruktor kosong untuk jenis yang Anda ikat.

  2. Lewati properti model binding dari tampilan pisau cukur sebagai argumen ke metode Post, dan jangan lupa untuk meneruskannya dari tampilan pisau cukur menggunakan tag helper.

  3. Model harus memiliki Get; Mengatur; untuk alat peraga, Anda bekerja dengan.

  4. Properti model yang mengikat, tambahkan atribut [BindProperty(Support Get= False)] dan pastikan Anda mendapatkan; mengatur; di atasnya.

Beri tahu saya jika Anda memerlukan contoh kode untuk ini.

Saya harap ini membantu seseorang. Vola!

0
Ahhzeee 25 September 2019, 01:42