【问题标题】:How to pass an entire ViewModel back to the controller如何将整个 ViewModel 传递回控制器
【发布时间】:2012-08-22 17:58:26
【问题描述】:

我有一个包含两个对象的 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; }
}

我有一个使用我的LookUpViewModel 并接收输入以搜索SearchableId 的视图。如果找到Searchable 对象,则会创建一个LookUpViewModel 对象并将其传递给视图。然后视图显示AddToSearchable.Data 的编辑器字段。提交后,我希望将 LookUpViewModel 传递给一个操作方法来处理所有后端代码。唯一的问题是,传递给我的操作方法的LookUpViewModel 包含对Searchable 的空引用和对AddToSearchable 的有效引用......即我丢失了一半的数据。

这是我的视图的示例:

@model HearingAidTrackingSystem.ViewModels.LookUpViewModel

@using (Html.BeginForm("LookUp", "Controller", "idStr", FormMethod.Post))
{
    <input type="text" name="idStr" id="idStr"/>
    <input type="submit" value="Search" />
}

@if (Model.Searchable != null && Model.AddToSearchable != null)
{
    using (Html.BeginForm("AddMyStuff", "Controller"))
    {
        Html.HiddenFor(model => model.Searchable.SearchableId);
        Html.HiddenFor(model => model.Searchable.AddedData);
        Html.HiddenFor(model => model.AddToSearchable.AddToSearchableId);
        Html.HiddenFor(model => model.AddToSearchable.SearchableId);
        Html.HiddenFor(model => model.AddToSearchable.Searchable);

        <div class="editor-field">
            @Html.EditorFor(model => model.AddToSearchable.Data)
            @Html.ValidationMessageFor(model => model.AddToSearchable.Data);
        </div>                                    

        <input type="submit" value="Submit" />
    }
}

这是我的操作方法:

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
}       

很抱歉这篇冗长的帖子。我尽力保持简单。您可能有任何建议.. 开火。

【问题讨论】:

    标签: asp.net-mvc forms viewmodel


    【解决方案1】:

    两种修复方法:

    1. 您可以为 Model.Searchable 的所有属性添加执行 HiddenFor()。

    2. 您可以使用序列化将 Model.Searchable 转换为文本表示形式,并在控制器中从序列化形式修复它。

    更新:问题是:你需要使用@Html.HiddenFor(),而不是Html.HiddenFor();。

    【讨论】:

    • 我尝试了您的第一个建议。不幸的是,这并没有解决我的问题。您的第二个建议可能有效,但这会破坏拥有 ViewModel 的目的。
    • 第一个建议有什么问题?你能用这个建议发表观点吗?
    • 虽然我觉得我之前的实现应该可以工作,但我已经更新了我的代码以反映这种变化。
    • 忘了提...我看到和以前一样的问题。 LookUpViewModel.Searchable 为空,而LookUpViewModel.AddToSearchable 有效。
    • 哦,我知道有什么问题:你需要使用@Html.HiddenFor(),而不是Html.HiddenFor();。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多