空视图模型传递给控制器

时间:2018-02-20 14:09:54

标签: asp.net-core asp.net-core-mvc viewmodel

我有一个基本的'创造'从域模型查看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。

2 个答案:

答案 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)

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