使用ViewModel在数据库中保存MVC下拉列表项



我对MVC架构完全陌生,需要帮助在数据库中保存下拉列表中选择的项目。基本上,对于创建视图上的每个项目模型,我都需要有一个下拉列表,我需要在其中选择客户端的距离(客户端的名称显示在下拉列表中(。根据所选客户端,ClientID应根据Post方法(作为外键(链接到数据库中的Project对象实例。

GET部分显示Create并填充Dropdownlist工作,POST是折磨我的。

这是我的项目模型:

public class Project
{
[Key]
public int ProjectId { get; set; }
public string Name { get; set; }
public string Budget { get; set; }
public string BusinessCase { get; set; }
[DataType(DataType.Date)]
public string StartDate { get; set; }
[DataType(DataType.Date)]
public string FinishDate { get; set; }
public int ClientId { get; set; }
public Client Client { get; set; }
public ICollection<ProjectMember> ProjectMembers { get; set; }
public Project()
{
}
}

这是我的客户模型:

public class Client
{
[Key]
public int ClientId { get; set; }
public string Name { get; set; }
public string State { get; set; }
public string Address { get; set; }
public int VAT { get; set; }
public ICollection<Project> Projects { get; set; }
public Client()
{
}
}

这是我的CreateProject ViewModel(有些属性可能不需要-我已经尝试了很多方法…(

public class CreateProjectViewModel
{
[Key]
public int ProjectId { get; set; }
public string Name { get; set; }
public string Budget { get; set; }
public string BusinessCase { get; set; }
[DataType(DataType.Date)]
public string StartDate { get; set; }
[DataType(DataType.Date)]
public string FinishDate { get; set; }
public int ClientId { get; set; }
public Client Client { get; set; }
public ICollection<ProjectMember> ProjectMembers { get; set; }

public IEnumerable<SelectListItem> Clients { get; set; }
}

这是我的Controller GET创建方法(用客户端表中的Select值填充下拉列表(:

public IActionResult Create()
{

var clients = _context.Client.Select(r => r.Name);
var viewmodel = new CreateProjectViewModel
{
Clients = new SelectList(clients)
};

return View(viewmodel); 
}

最后,这是使用CreateProjectViewModel创建视图:

@model ProjectPortfolioApp.ViewModels.CreateProjectViewModel

@{
ViewData["Title"] = "Create";
}

<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
@Html.LabelFor(model => model.Client.Name, htmlAttributes: new { @class = "control label col-md-2" })
**@Html.DropDownListFor(model => model.ClientId, Model.Clients, "---Select Client---", new { @class = "form-control" })**
</div>

上面的代码适用于使用public IEnumerable<SelectListItem> Clients { get; set; }按预期显示Dropdown元素(客户端名称(。我正在努力解决的是POST部分,在该部分中我收到错误对象引用未设置为对象实例。当我发布model => model.ClientId时,如果我在这里传递的基本上是其他任何东西,例如model => model.Name,则没有错误,只有客户端ID没有成功发布到数据库中(显然(。

以下是HTTPPost的片段,这很可能是错误的:

[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(CreateProjectViewModel model)
{
if (ModelState.IsValid)
{
var project = new Project() { Name = model.Name, ClientId = model.ClientId, Budget = model.Budget, BusinessCase = model.BusinessCase, StartDate = model.StartDate, FinishDate = model.FinishDate };
_context.Add(project);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}

return View();

}

有人能查看我的代码并帮助我识别吗:

  • 我的GET Create是否构建良好以达到POST Create的目的
  • 应该在@Html中传递什么。DropDownListFor作为的有效参数避免错误
  • HTTP Post Create应该是什么样子

我查看了几十个线程,不幸的是没有任何帮助。真的,任何帮助都将不胜感激。谢谢

您必须修复操作

public IActionResult Create()
{
var clients = _context.Client
.Select(r =>  new SelectListItem{ Value= r.ClientId.ToString(), Text= r.Name)
.ToList();
var viewmodel = new CreateProjectViewModel
{
Clients = clients
.... another properties
};

return View(viewmodel); 
}

并查看

@Html.DropDownListFor(model => model.ClientId, @Model.Clients, "---Select Client---", new { @class = "form-control" })

最新更新