Asp.net mvc 如何将整个ViewModel传递回控制器

Asp.net mvc 如何将整个ViewModel传递回控制器,asp.net-mvc,forms,viewmodel,Asp.net Mvc,Forms,Viewmodel,我有一个包含两个对象的ViewModel: public class LookUpViewModel { public Searchable Searchable { get; set; } public AddToSearchable AddToSearchable { get; set; } } 包含的两个模型如下所示: public class Searchable { [Key] public int SearchableId { get; set; }

我有一个包含两个对象的ViewModel:

public class LookUpViewModel
{
    public Searchable Searchable { get; set; }
    public AddToSearchable AddToSearchable { get; set; }
}
包含的两个模型如下所示:

public class Searchable
{
    [Key]
    public int SearchableId { get; set; }
    public virtual ICollection<AddToSearchable> AddedData { get; set; }
}

public class AddToSearchable
{
    [Key]
    public int AddToSearchableId { get; set;}
    [Required]
    public int SearchableId { get; set; }
    [Required]
    public String Data { get; set; }
    [Required]
    public virtual Searchable Searchable { get; set; }
}
以下是我的行动方法:

public ActionResult LookUp(LookUpViewModel vm)
{
    return View(vm);
}

[HttpPost]
public ActionResult LookUp(string idStr)
{
    int id = /*code to parse string to int goes here*/;

    Searchable searchable = dal.GetById(id);
    LookUpViewModel vm = new LookUpViewModel { Searchable = searchable, 
                                               AddToSearchable = new AddToSearchable() };
    //When breakpoint is set, vm contains valid references
    return View(vm);
}

[HttpPost]
public ActionResult AddMyStuff(LookUpViewModel vm)
{
    //**Problem lies here**

    //Do backend stuff
}       
很抱歉邮件太长。我尽力使它简单。你有什么建议吗。。开火。

两种修复方法:

  • 您可以为Model.Searchable的所有属性添加to do HiddenFor()

  • 您可以使用序列化将模型.Searchable转换为文本表示形式,并从controller中的序列化表单修复它


  • 更新:问题是:您需要使用@Html.HiddenFor(),而不是Html.HiddenFor()

    我尝试了你的第一个建议。不幸的是,这并没有解决我的问题。您的第二个建议可能有效,但这会破坏创建ViewModel的目的。第一个建议有什么问题?你能用这个建议发布视图吗?虽然我觉得我以前的实现应该可以工作,但我已经更新了我的代码来反映这个变化。忘记提到。。。我看到了和以前一样的问题
    LookUpViewModel.Searchable
    为空,而
    LookUpViewModel.AddToSearchable
    有效。哦,我知道有什么问题:你需要使用@Html.HiddenFor(),而不是Html.HiddenFor();。
    public ActionResult LookUp(LookUpViewModel vm)
    {
        return View(vm);
    }
    
    [HttpPost]
    public ActionResult LookUp(string idStr)
    {
        int id = /*code to parse string to int goes here*/;
    
        Searchable searchable = dal.GetById(id);
        LookUpViewModel vm = new LookUpViewModel { Searchable = searchable, 
                                                   AddToSearchable = new AddToSearchable() };
        //When breakpoint is set, vm contains valid references
        return View(vm);
    }
    
    [HttpPost]
    public ActionResult AddMyStuff(LookUpViewModel vm)
    {
        //**Problem lies here**
    
        //Do backend stuff
    }