C# 下拉列表值未在创建MVC 5上过帐

C# 下拉列表值未在创建MVC 5上过帐,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,如果这是一个愚蠢的问题,我很抱歉,但是我被难住了。这是我尝试的第一个MVC应用程序,来自web表单。我有以下型号: public class IndividualItem { [Required][Key] public string SerialNumber { get; set; } public virtual NSN NSNnumber { get; set; } public string Location { get; set; } publi

如果这是一个愚蠢的问题,我很抱歉,但是我被难住了。这是我尝试的第一个MVC应用程序,来自web表单。我有以下型号:

public class IndividualItem
{
    [Required][Key]
    public string SerialNumber { get; set; }
    public virtual NSN NSNnumber { get; set; }
    public string Location { get; set; }
    public string User { get; set; }
}

控制器

public ActionResult Create()
    {
        var view = new IndividualItemNSNselectList();
        view.NSNlist = new SelectList(db.NSNs.ToList(),"NSNnumber","Description");
        return View(view);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "SerialNumber,Location,User")] IndividualItem individualItem)
    {
        if (ModelState.IsValid)
        {
            db.IndividualItem.Add(individualItem);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(individualItem);
    }
在视野中俯视

<div class="form-group">
            @Html.LabelFor(model => model.IndividualItem.NSNnumber, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.IndividualItem.NSNnumber,Model.NSNlist, " ")
                @Html.ValidationMessageFor(model => model.IndividualItem.NSNnumber, "", new { @class = "text-danger" })
            </div>
        </div>

@LabelFor(model=>model.IndividualItem.NSNnumber,htmlAttributes:new{@class=“controllabel col-md-2”})
@Html.DropDownListFor(model=>model.IndividualItem.NSNnumber,model.NSNlist,“”)
@Html.ValidationMessageFor(model=>model.IndividualItem.NSNnumber,“,new{@class=“text danger”})
当我尝试为IndividualItem创建视图时,一切都正常,包括下拉列表的填充。但是,当我发布时,NSN对象没有被输入到数据库中


我已经做了很多研究,这让我走到了这一步,但我无法找出什么是错的。感谢您的帮助,如果您需要我澄清任何事情,请告诉我。

您的代码中需要两个修改:

更改1: 下拉列表应该绑定到属性而不是类

将下拉列表更新为:

@Html.DropDownListFor(model => model.IndividualItem.NSNnumber.NSNnumber, Model.NSNlist, " ")
更改2:

操作方法中的绑定属性缺少要绑定的必需属性。更新您的行动后方法,如下所示:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "SerialNumber,Location,User,NSNnumber")] IndividualItem individualItem)
{
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Exclude= "SerialNumber,Location,User")] IndividualItem individualItem)
{
}
或者,如果您打算排除这些属性,请按以下方式进行修改:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "SerialNumber,Location,User,NSNnumber")] IndividualItem individualItem)
{
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Exclude= "SerialNumber,Location,User")] IndividualItem individualItem)
{
}

希望这对你有用。我自己验证过。

您的代码中需要两个修改:

更改1: 下拉列表应该绑定到属性而不是类

将下拉列表更新为:

@Html.DropDownListFor(model => model.IndividualItem.NSNnumber.NSNnumber, Model.NSNlist, " ")
更改2:

操作方法中的绑定属性缺少要绑定的必需属性。更新您的行动后方法,如下所示:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "SerialNumber,Location,User,NSNnumber")] IndividualItem individualItem)
{
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Exclude= "SerialNumber,Location,User")] IndividualItem individualItem)
{
}
或者,如果您打算排除这些属性,请按以下方式进行修改:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "SerialNumber,Location,User,NSNnumber")] IndividualItem individualItem)
{
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Exclude= "SerialNumber,Location,User")] IndividualItem individualItem)
{
}

希望这对你有用。我自己验证过。

您的代码中有多个错误,还有一些不好的做法

首先,不能将
绑定到复杂对象的属性(它只回发一个简单的值,即所选选项的值)。假设您希望绑定到
NSN
NSNnumber
,则需要修改视图代码

@Html.DropDownListFor(m => m.IndividualItem.NSNnumber.NSNnumber, Model.NSNlist, "")
正如萨凯特所指出的那样

其次,视图中的模型是
IndividualItemsSelectList
,这意味着POST方法参数中的模型也必须是
IndividualItemsSelectList
。您的POST方法签名应该是

public ActionResult Create IndividualItemNSNselectList model)
在POST方法中获取任何内容的唯一原因是,您将参数命名为与属性相同的属性,这可能会导致其他问题,包括当您返回视图时,因为
ModelState
无效,您将获得一个异常(有关更多详细信息,请参阅)因为您将
IndividualItem
的实例传递回一个视图,该视图需要
individualitemsselectlist

正确使用视图模型可以很容易地解决所有这些问题。视图模型不应包含属于数据模型的属性,而应仅包含要在视图中显示/编辑的数据模型的属性。此外,在使用视图模型时,您不需要使用
[Bind]
属性,因为您已经防止了过度发布攻击。请参阅

您的
[Bind]
属性表明您只有4个编辑属性,因此您的视图模型应该是(根据需要添加显示和验证属性)

POST方法签名现在变为

public ActionResult Create IndividualItemVM model)
在方法中,创建数据模型的新实例,并从视图模型映射其属性,然后保存


此外,还必须在返回视图之前重新填充
选择列表
,否则当前代码将出现另一个异常,如中所述。作为旁注,在查询中使用
.ToList()
来生成
选择列表
是不必要的。

您的代码中有多个错误,并且存在一些错误做法

首先,不能将
绑定到复杂对象的属性(它只回发一个简单的值,即所选选项的值)。假设您希望绑定到
NSN
NSNnumber
,则需要修改视图代码

@Html.DropDownListFor(m => m.IndividualItem.NSNnumber.NSNnumber, Model.NSNlist, "")
正如萨凯特所指出的那样

其次,视图中的模型是
IndividualItemsSelectList
,这意味着POST方法参数中的模型也必须是
IndividualItemsSelectList
。您的POST方法签名应该是

public ActionResult Create IndividualItemNSNselectList model)
在POST方法中获取任何内容的唯一原因是,您将参数命名为与属性相同的属性,这可能会导致其他问题,包括当您返回视图时,因为
ModelState
无效,您将获得一个异常(有关更多详细信息,请参阅)因为您将
IndividualItem
的实例传递回一个视图,该视图需要
individualitemsselectlist

正确使用视图模型可以很容易地解决所有这些问题。视图模型不应包含属于数据模型的属性,而应仅包含要在视图中显示/编辑的数据模型的属性。此外,在使用视图模型时,您不需要使用
[Bind]
属性,因为您已经防止了过度发布攻击。请参阅

您的
[Bind]
属性表明您只有4个编辑属性,因此您的视图模型应该是(根据需要添加显示和验证属性)

POST方法签名现在变为

public ActionResult Create IndividualItemVM model)
在方法中,创建数据模型的新实例,并从视图模型映射其属性,然后保存

此外,还必须在返回视图之前重新填充
选择列表
,否则当前代码将出现另一个异常,如中所述。作为旁注,在查询中使用
.ToList()
生成
选择列表<