Null ViewModel传递给控制器



我有一个基本的'创建'视图从域模型中划分为脚手架,因此将其输入到模型

@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

更多阅读

您需要在表单中添加名称属性,以便控制器将其拾取。

相关内容

  • 没有找到相关文章