【问题标题】:Getting posted ID from Dropdownlist model which is not included in the modelview从模型视图中不包含的下拉列表模型获取发布的 ID
【发布时间】:2016-08-02 16:24:48
【问题描述】:

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

直接模型的代码 sn-ps 可以很好地与自动实现的 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; }
    ....
}

此模型视图仅在下拉列表中显示银行信息,尽管当通过“提交”按钮发布信息时,它给我一个错误,即银行 ID 不能为空。如果我手动插入所有选择的下拉列表项都是 1(例如:_OrganizationUserSignedBy.Organization.BankID = 1;),我测试了它是否工作正常。问题是我的模型视图中没有正确接收到发布的信息。

模型视图代码sn-ps:

控制器

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:部分代码被剪掉了,所以你不会花太长时间就明白问题出在哪里。

【问题讨论】:

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


    【解决方案1】:

    您创建的 <select> 元素具有与您的模型无关的名称属性。比如第一个是

    <select name="BankID" .... >
    

    但是您的模型没有名为 BankID 的属性(尽管它确实有一个名为 Organization 的属性,它似乎有一个名为 BankID 的属性。

    尽管您声称,您的第一个实现也无法正常工作。您不能对绑定到的属性和SelectList 的名称使用相同的名称(例如,您不会获得客户端验证)并且您应该始终对包含表单的视图使用视图模型(并且该视图模型将包含每个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" />
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2016-06-25
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      相关资源
      最近更新 更多