我有一个基本的'创建'视图从域模型中划分为脚手架,因此将其输入到模型
@model TblProduct
<form asp-controller="Product" asp-action="Create">
...
<input asp-for="Artist" class="form-control" />
...
我正在尝试添加功能并使用视图模型,而我从其中只有一个非常基本的ViewModel开始,其中仅具有该域模型:
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参数传递给创建方法,但在检查时是无效的。但是,modelstate.isvalid是正确的。因此,代码试图写入DB并失败。
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。
您当前的Bind
属性正在寻找以下属性ID,Artist,ProductTitle...
(白色名单(,并且找不到它们,因此它忽略了所有内容并将其视为(黑色名单(项目。
您可以使用Bind
属性来装饰ProductViewModel
如下:
[Bind(Include = "P")]
public class ProductViewModel
{
public TblProduct P { get; set; }
}
当然,这意味着TblProduct
中的所有属性都将在提交时
如果您不希望所有属性在TblProduct
提交中绑定,则可以使用Bind
属性来装饰TblProduct
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
您需要在表单中添加名称属性,以便控制器将其拾取。