C# 下拉列表值未在创建MVC 5上过帐
如果这是一个愚蠢的问题,我很抱歉,但是我被难住了。这是我尝试的第一个MVC应用程序,来自web表单。我有以下型号: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
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()
生成选择列表<