Asp.net mvc 在ASP.MVC中发送表单数据

Asp.net mvc 在ASP.MVC中发送表单数据,asp.net-mvc,Asp.net Mvc,我有一张如下的表格。当我发送表单时,数据(id、content、gdate)到达post-ActionResult。然而,一个字段(名为“category”)在post端得到null。缺失的部分是什么 BlogPost模型: public class BlogPost { public virtual string Id { get; set; } public virtual string content { get; set; } public virtual st

我有一张如下的表格。当我发送表单时,数据(id、content、gdate)到达post-ActionResult。然而,一个字段(名为“category”)在post端得到null。缺失的部分是什么

BlogPost模型:

 public class BlogPost
{
    public virtual string Id { get; set; }
    public virtual string content { get; set; }
    public virtual string gdate { get; set; }
    public virtual Category Category { get; set; }

}
类别模型:

public class Category
{
    public int ID{ get; set; }
    public string Name{ get; set; }
}
视图模型:

 public class CreateVM
{        
    public BlogPost BlogPost { get; 
    public IEnumerable<SelectListItem> Categories;
}
public class CreateVM
{        
public BlogPost BlogPost { get; set;}
public IEnumerable<SelectListItem> Categories{ get; set;}
public int CategoryId{ get; set;}
}
视图:

更改您的助手:

@Html.DropDownListFor(model => model.BlogPost.Category.ID, Model.Categories);
它将在post上绑定选定的
Id

然后更改控制器以从数据库中获取现有实体:

[HttpPost]    
public ActionResult Create(CreateVM vm)
{
    if (ModelState.IsValid)
    {
        // this is the line where you should get your category entoty from DB. MAby you have different tables. it just example
        vm.BlogPost.Category = db.Categories.FirstOrDefault(x => x.ID == vm.BlogPost.Category.ID)
        db.BlogPosts.Add(vm.BlogPost);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
}

我已经修改了你的模型和视图,以使事情顺利进行

视图模型:

 public class CreateVM
{        
    public BlogPost BlogPost { get; 
    public IEnumerable<SelectListItem> Categories;
}
public class CreateVM
{        
public BlogPost BlogPost { get; set;}
public IEnumerable<SelectListItem> Categories{ get; set;}
public int CategoryId{ get; set;}
}

注意:类别字段仍将仅返回空值,但在发布表单时,您将看到下拉列表中所选的Id值被相应的Id值填充,这将有助于进一步处理内容。

类别是一个复杂对象,您无法将
(或任何元素)绑定到复杂对象。您应该使用具有属性
int-SelectCategory
(绑定到
BlogPost.Category.ID
不是一个好主意,如果
Category
的任何属性包含验证属性,则
ModelState
将无效)的视图模型可以工作。数据正常运行。例如,类别ID为“5”。但是,当我从SQL Explorer中检查相关行类别中的数据表时,ID似乎为“8”。我不知道为什么?@SuatAtan,因为我认为这是一个新的实体。您应该使用FirstOrDefault()方法在控制器post中从db获取existant,但我无法做到这一点。你能详细解释一下吗?@SuatAtan没问题,如果这对你有帮助的话-把它标记为一个答案。让我们。
 @Html.DropDownListFor(model => model.CategoryId, new SelectList(Model.Categories, "ID", "Name"));