Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定属性为空_C#_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 绑定属性为空

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

我对这一点很陌生,我想弄清楚会发生什么,我认为这是最好的提问地点。当我选择项目并按下add按钮时,属性[Bind”“]模型为空,但为什么

我的看法是:

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