从Dropdownlist模型中获取已发布的ID,该模型未包含在模型视图

时间:2016-04-12 07:46:41

标签: c# asp.net-mvc entity-framework razor asp.net-mvc-5

当我尝试将发布的信息插入与“银行”有直接关系的模型时,它的工作非常好。

直接模型的代码片段,适用于自动实现的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:有些代码被删除了,所以你不会花太多时间来理解问题所在。

1 个答案:

答案 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" />
}