C# 绑定属性为空
我对这一点很陌生,我想弄清楚会发生什么,我认为这是最好的提问地点。当我选择项目并按下add按钮时,属性[Bind”“]模型为空,但为什么 我的看法是:C# 绑定属性为空,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我对这一点很陌生,我想弄清楚会发生什么,我认为这是最好的提问地点。当我选择项目并按下add按钮时,属性[Bind”“]模型为空,但为什么 我的看法是: @model PortfolioDetailsVM <form asp-controller="Portfolio" asp-action="AddProject" method="POST"> <div class="form-group"> <div class="input-group
@model PortfolioDetailsVM
<form asp-controller="Portfolio" asp-action="AddProject" method="POST">
<div class="form-group">
<div class="input-group mb-3">
<select asp-for="PortfolioProjects.ProjectId" class="custom-select form-control">
<option disabled selected value="@null">Choose...</option>
@foreach (var item in Model.Projects)
{
<option value="@item.ProjectID">@item.Title</option>
}
</select>
@model PortfolioDetailsVM
选择。。。
@foreach(Model.Projects中的var项)
{
@项目.标题
}
var PortfolioVM与任何数据一起为空。
这是我的控制器和视图模型:
namespace PEG.Models
{
public class PortfolioDetailsVM
{
public PortfolioDetailsVM()
{
Portfolios = new Portfolio();
PortfolioProjects = new PortfolioProject();
}
public Portfolio Portfolio;
public PortfolioProject PortfolioProjects;
public IEnumerable<Project> Projects;
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> AddProject([Bind("PortfolioProject")]PortfolioDetailsVM PortfolioVM) //<----Null
{
var addproject = PortfolioVM.PortfolioProjects;
if (ModelState.IsValid)
{
try
{
context.Update(addproject);
await context.SaveChangesAsync();
return RedirectToAction("Details", "Portfolio" + PortfolioVM.PortfolioProjects.PortfolioId);
}
catch (DbUpdateException)
{
ModelState.AddModelError("", "Unable to save changes. " +
"Try again, and if the problem persists, " +
"see your system administrator.");
}
}
return RedirectToAction("Index", "Portfolio");
}
namespace PEG.Models
{
公共类PortfolioDetailsVM
{
公共PortfolioDetailsVM()
{
公文包=新公文包();
PortfolioProjects=新PortfolioProjects();
}
公共投资组合;
公共投资组合项目投资组合项目;
公共工程;
}
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务AddProject([Bind(“PortfolioProject”)]PortfolioDetailsVM PortfolioVM)//x.Task.toListSync(),
公文包=wait context.Portfolio.SingleOrDefaultAsync(x=>x.PortfolioID==id)
};
返回视图(PortfolioVM);
}
名称空间PEG.Models
{
公共部分类PortfolioProject
{
[数据库生成(DatabaseGeneratedOption.Computed)]
[列(TypeName=“datetime2”)]
公共日期时间?CreatedDate{get;set;}
//关系
[关键]
[第列(顺序=0)]
public int PortfolioId{get;set;}
[关键]
[第列(顺序=1)]
公共字符串ProjectId{get;set;}
//关系
[ForeignKey(“PortfolioId”)]
公共虚拟投资组合{get;set;}
[外键(“ProjectId”)]
公共虚拟项目{get;set;}
}
}
绑定到属性
首先,在ViewModels中定义了字段。它们可以在视图中读取,但要使模型绑定起作用,您需要使用get和set访问器将它们声明为属性:
public class PortfolioDetailsVM
{
//...
public Portfolio Portfolio { get; set; }
public PortfolioProject PortfolioProject { get; set; }
public IEnumerable<Project> Projects { get; set; }
}
以相应的形式:
@model PortfolioDetailsVM
<select asp-for="SelectedProjectId" class="custom-select form-control">
...
</select>
@model PortfolioDetailsVM
...
发到哪里
public async Task<IActionResult> AddProject(DetailsAddProjectVM bindingModel)
{
//look ma, no [Bind]!
var projectid = bindingModel.SelectedProjectId;
}
public异步任务AddProject(DetailsAddProjectVM绑定模型)
{
//听着,妈妈,不要束缚!
var projectid=bindingModel.SelectedProjectId;
}
当然,对于要呈现的相应表单,还必须在原始的PortfolioDetailsVM
中声明SelectedProjectId
属性
正如您所见,您根本没有绑定到原始视图模型。调用此方法的代码在哪里?@JamesS I发布调用控制器的视图。post
详细信息
控制器方法公文包@Sumitraj I发布文件夹方法不确定这是否是实际问题的输入错误,但是您有asp for=“PortfolioProjects.ProjectId”
,带有PortfolioProjects
,复数形式。根据您的型号,它应该是单数的。是的!最后我抓到了数据谢谢!但现在我要保存时收到:实体类型“PortfolioProject”上的属性“PortfolioID”有一个临时值。
@model PortfolioDetailsVM
<select asp-for="SelectedProjectId" class="custom-select form-control">
...
</select>
public async Task<IActionResult> AddProject(DetailsAddProjectVM bindingModel)
{
//look ma, no [Bind]!
var projectid = bindingModel.SelectedProjectId;
}