gpt4 book ai didi

c# - InvalidOperationException Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.CreateModel(ModelBindingContext bindingContext)

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:22 25 4
gpt4 key购买 nike

我正在尝试将复杂类型绑定(bind)到属性以编辑属性值并将更改保存在内存中,现在用于测试。

I get an exception when I execute Post. 

这是我的编辑 Razor View 。

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






问题子源于ClientConfig EditClient Property位于 EditModel: PageModel 类行#18。

get 工作正常但是当我尝试发布在表单页面上所做的更改时我得到 InvalidOperationException Could not create an instance of type 'ProjectName.Core.ClientConfig模型绑定(bind)的复杂类型不能是抽象类型或值类型,并且必须具有无参数构造函数。或者,为“EditClient”参数提供一个非空默认值。

我已经坚持了一天左右,并查看了其他堆栈问题及其答案,但我不理解所提供的答案和术语或示例。

抱歉,如果我没有说清楚我的问题,但这是我力所能及的。

如有任何帮助,我们将不胜感激。

再次感谢。

最佳答案

终于明白了。

执行以下操作,1. 确保您的标签名称与您要绑定(bind)的属性匹配。"

  1. 为您要绑定(bind)的类型重载一个空构造函数。

  2. 将 razor View 中的绑定(bind)模型属性作为参数传递给 Post 方法,并且不要忘记使用标记助手从 razor View 中传递它。

  3. 模型必须有一个Get;放;对于 Prop ,你正在使用。

  4. 绑定(bind)模型属性,添加属性[BindProperty(Support Get= False)]并确保你得到了;放;在上面。

如果您需要这方面的代码示例,请告诉我。

我希望这对某人有所帮助。哇!

关于c# - InvalidOperationException Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.CreateModel(ModelBindingContext bindingContext),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58017354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com