当我尝试将发布的信息插入与“银行”有直接关系的模型时,它的工作非常好。
直接模型的代码片段,适用于自动实现的CRUD操作
public class Organization
{
public int ID { get; set; }
....
[Display(Name = "Bank:")]
public int BankID { get; set; }
public virtual Bank Bank { get; set; }
....
}
public class Bank
{
public int ID { get; set; }
[Display(Name = "Bank")]
public string Title { get; set; }
}
控制器:
public ActionResult Create()
{
ViewBag.BankID = new SelectList(db.Banks, "ID", "Title");
....
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Organization organization)
{
if (ModelState.IsValid)
{
organization.OrganizationStatusID = 1;
db.Organizations.Add(organization);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.BankID = new SelectList(db.Banks, "ID", "Title", organization.BankID);
....
return View(organization);
}
但我遇到的问题是,当我尝试用以下方法实现它时:
public class _OrganizationUserSignedBy
{
public int ID { get; set; }
public Organization Organization { get; set; }
....
}
此ModelView仅显示Dropdownlist中的银行信息,但是当通过“提交”按钮发布信息时,它会给出一个错误,即bankID不能为空。我测试了它是否有效,如果我手动插入所有选择的下拉列表项目将是1(例如:_OrganizationUserSignedBy.Organization.BankID = 1;)它工作正常。问题是我的ModelView中没有正确接收发布的信息。
Modelview代码段:
控制器
public ActionResult Create()
{
ViewBag.BankID = new SelectList(db.Banks, "ID", "Title");
....
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(_OrganizationUserSignedBy _OrganizationUserSignedBy)
{
if (ModelState.IsValid)
{
_OrganizationUserSignedBy.Organization.OrganizationStatusID = 1;
db.Organizations.Add(_OrganizationUserSignedBy.Organization);
_OrganizationUserSignedBy.Organization.BankID = 1;
....
db.SaveChanges();
_OrganizationUserSignedBy.User.OrganizationID = db.Organizations.Max(x => x.ID);
_OrganizationUserSignedBy.SignedBy.OrganizationID = db.Organizations.Max(x => x.ID);
db.Users.Add(_OrganizationUserSignedBy.User);
db.SignedBys.Add(_OrganizationUserSignedBy.SignedBy);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.BankID = new SelectList(db.Banks, "ID", "Title", _OrganizationUserSignedBy.Organization.BankID);
....
return View(_OrganizationUserSignedBy);
}
创建视图:
@model MVC_CPO_REGRELEASE.Models._OrganizationUserSignedBy
....
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
....
@Html.LabelFor(model => model.Organization.BankID, "*Banko pavadinimas:")
@Html.DropDownList("BankID", null, "Pasirinkite...")
@Html.ValidationMessageFor(model => model.Organization.BankID)
现在正在寻找一种方法,我找不到解决方案..任何帮助都会受到赞赏,如果你现在或将来有任何提示,我会非常感激。谢谢!
PS:有些代码被删除了,所以你不会花太多时间来理解问题所在。答案 0 :(得分:1)
您创建的<select>
元素具有与您的模型无关的名称属性。例如,第一个是
<select name="BankID" .... >
但您的模型没有名为BankID
的属性(尽管它有一个名为Organization
的属性,它似乎有一个名为BankID
的属性。
尽管你声称,你的第一个实现也无法正常工作。您不能对绑定的属性和SelectList
的名称使用相同的名称(例如,您不会获得客户端验证),并且您应该始终使用包含表单的视图的视图模型(以及该视图) model将包含每个SelectList
属性的属性。此外,您不应该绑定到数据模型的属性。如果Organization
的任何属性具有验证属性,则ModelState
将无效。
您的视图模型应为
public class OrganizationUserSignedByVM
{
public int? ID { get; set; } // so you can use it in an edit view as well
[Display(Name = "Bank")]
[Required(ErrorMesage = "Please select a bank")]
public int SelectedBank { get; set; }
public SelectList BankList { get; set; }
.....
}
并在控制器中
public ActionResult Create()
{
OrganizationUserSignedByVM model= new OrganizationUserSignedByVM();
ConfigureViewModel(model);
return View(model);
}
public ActionResult Create(OrganizationUserSignedByVM model)
{
if (!ModelState.IsValid)
{
ConfigureViewModel(model);
return View(model);
}
// initialise a new instance of your data model(s) and save
// redirect
}
private void ConfigureViewModel(OrganizationUserSignedByVM model)
{
model.BankList = new SelectList(db.Banks, "ID", "Title");
....
}
并在视图中
@model yourAssembly.OrganizationUserSignedByVM
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.SelectedBank)
@Html.DropDownListFor(m => m.SelectedBank, Model.BankList, "-Please select-")
@Html.ValidationMessageFor(m => m.SelectedBank)
....
<input type="submit" value="Save" />
}