我是新来的,我想弄清楚发生了什么,并认为这是最好的地方问。那么,当我选择这个项目并按下add按钮时,属性绑定“”Model来了空,但为什么呢?
这是我的观点:
@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>变量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");
}这是另一种模型和细节方法:
// GET: Portfolio/Details/5
public async Task<ActionResult> Details(int id)
{
PortfolioDetailsVM PortfolioVM = new PortfolioDetailsVM
{
Projects = await context.Project.Include(x => x.Task).ToListAsync(),
Portfolios = await context.Portfolio.SingleOrDefaultAsync(x => x.PortfolioID == id)
};
return View(PortfolioVM);
}
namespace PEG.Models
{
public partial class PortfolioProject
{
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[Column(TypeName = "datetime2")]
public DateTime? CreatedDate { get; set; }
//RelationsId
[Key]
[Column(Order = 0)]
public int PortfolioId { get; set; }
[Key]
[Column(Order = 1)]
public string ProjectId { get; set; }
//Relations
[ForeignKey("PortfolioId")]
public virtual Portfolio Portfolio { get; set; }
[ForeignKey("ProjectId")]
public virtual Project Project { get; set; }
}
}发布于 2019-01-17 22:47:39
绑定到属性
首先,您在ViewModels中定义了字段。它们可以在视图中读取,但是要使模型绑定工作,需要使用get和set访问器将它们声明为Properties:
public class PortfolioDetailsVM
{
//...
public Portfolio Portfolio { get; set; }
public PortfolioProject PortfolioProject { get; set; }
public IEnumerable<Project> Projects { get; set; }
}这将使您的绑定代码工作。
更好的绑定模型
其次,您使用模型绑定的方式有点不正确。尽量不要直接绑定到数据模型(例如,PortfolioProject的类型)。绑定到的模型不应该包含对数据模型类型的任何引用。
相反,我通常只在绑定到的模型中声明我真正需要的内容,这样我就不必首先使用ol‘Bind属性了。这是一个简单的例子:
public class DetailsAddProjectVM
{
public string SelectedProjectId { get; set; }
}并附上相应的表格:
@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;
}当然,要呈现相应的表单,还必须在原始的SelectedProjectId中声明PortfolioDetailsVM属性。
正如您所看到的,您根本没有可以绑定到原始视图模型的。
https://stackoverflow.com/questions/54236229
复制相似问题