【问题标题】:Sending Form Data in ASP.MVC在 ASP.MVC 中发送表单数据
【发布时间】:2016-05-06 13:19:46
【问题描述】:

我有如下表格。当我发送表单时,数据(id、content、gdate)到达 post ActionResult。但是,一个字段(名为“类别”)在帖子端变为空。缺少什么?

博文模型:

 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;
}

控制器:

// GET: BlogPosts/Create
    public ActionResult Create()
    {
        CreateVM vm = new CreateVM();
        vm.Categories = new SelectList(db.Categories, "ID", "Name");
        return View(vm);
    }


        return View(vm);
    }

[HttpPost]    
public ActionResult Create(CreateVM vm)
        {
            if (ModelState.IsValid)
            {
                db.BlogPosts.Add(vm.BlogPost);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

查看:

@Html.DropDownListFor(model => model.BlogPost.Category, Model.Categories);

【问题讨论】:

  • Category 是一个复杂对象,您不能将&lt;select&gt;(或任何元素)绑定到一个复杂对象。您应该使用具有属性int SelectCategory 的视图模型(绑定到BlogPost.Category.ID 不是一个好主意,如果Category 的任何属性包含验证属性,那么ModelState 将无效)

标签: asp.net-mvc


【解决方案1】:

我已经修改了你的模型和视图以使事情正常运行..

视图模型:

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

查看:

 @Html.DropDownListFor(model => model.CategoryId, new SelectList(Model.Categories, "ID", "Name"));

注意:Category 字段仍然只会返回 null 值,但在发布表单时,您会看到下拉列表中选定的 Id 值被相应的值填充,这将有助于进一步处理这些事情..

【讨论】:

    【解决方案2】:

    更换你的助手:

    @Html.DropDownListFor(model => model.BlogPost.Category.ID, Model.Categories);
    

    它将在帖子中绑定选定的Id

    然后更改您的控制器以从 db 获取现有实体:

    [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");
        }
    }
    

    【讨论】:

    • 它有效。数据正确地进入 Action。例如,类别 ID 为“5”。但是,当我从 SQL Explorer 中检查相关行 Category_ID 中的数据表时,似乎为“8”。不知道为什么?
    • @SuatAtan 因为 EF 认为它是新实体。您应该使用 FirstOrDefault() 方法从控制器中的数据库中获取存在
    • 我做不到。请详细说明一下好吗?
    • @SuatAtan 没问题,如果对您有帮助 - 将其标记为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2022-01-11
    • 2017-03-25
    • 2015-11-20
    • 2012-03-22
    相关资源
    最近更新 更多