我有一个基本的'创造'从域模型查看scaffolded,因此将其键入模型
@model TblProduct
<form asp-controller="Product" asp-action="Create">
...
<input asp-for="Artist" class="form-control" />
...
我尝试添加功能并使用视图模型,而且我从一个非常基本的视图模型开始,其中只包含该模型:
public class ProductViewModel
{
public TblProduct P { get; set; }
}
现在我已经改变了“创造”。查看以使用视图模型
@model ProductViewModel
<form asp-controller="Product" asp-action="Create">
...
<input asp-for="P.Artist" class="form-control" />
...
所以我希望模型是有效的(除了编辑变量名称)我填写表单中的所有相同字段,实际上没有其他字段添加到模型中。
发布表单时发生错误,我将ProductViewModel参数传递给create方法但在检查时它为null。但是ModelState.IsValid为true。因此代码尝试写入数据库并失败。
public async Task<IActionResult> Create([Bind("ID,Artist,ProductTitle... (long list removed)...] ProductViewModel productAndItems)
{
var prod = productAndItems.P;
if (ModelState.IsValid)
{
_context.Add(prod);
...FAIL
知道我应该在这里查看什么 - 我错过了什么?
如何获取视图(键入视图模型)以将模型数据传递给控制器?如果它为空,ModelState.IsValid
怎么可能是真的?在上面的示例中,我已调试,productAndItems
中传递的参数为null。
答案 0 :(得分:0)
您当前的Bind
属性正在查找以下属性ID,Artist,ProductTitle...
(白名单)并且找不到它们因此它会忽略所有内容并将其视为a(黑名单)项目。
您可以使用ProductViewModel
属性装饰Bind
,如下所示:
[Bind(Include = "P")]
public class ProductViewModel
{
public TblProduct P { get; set; }
}
这当然意味着TblProduct
中的所有属性在提交时都会被绑定
如果您不希望在提交TblProduct
时绑定所有属性,那么您可以使用TblProduct
属性修饰Bind
,如下所示
public class ProductViewModel
{
public TblProduct P { get; set; }
}
[Bind(Include = "ID,Artist,ProductTitle")]
public class TblProduct
{
public int ID { get; set; }
public string Artist { get; set; }
public string ProductTitle { get; set; }
public string ProductSubTitle { get; set; } //we will not include this in our (White-list)
//more props
}
更多阅读 MSDN
答案 1 :(得分:0)
您需要为表单添加名称属性,以便控制器将其选中。