【问题标题】:Null viewmodel passed to controller空视图模型传递给控制器
【发布时间】:2018-02-20 14:09:54
【问题描述】:

我有一个基于域模型的基本“创建”视图,因此它被键入到模型中

@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 方法,但检查时它为空。但是 ModelState.IsValid 是真的。所以代码尝试写入数据库并失败。

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。

【问题讨论】:

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


    【解决方案1】:

    您当前的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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多