5

2つのオブジェクトを含むViewModelがあります。

public class LookUpViewModel
{
    public Searchable Searchable { get; set; }
    public AddToSearchable AddToSearchable { get; set; }
}

含まれている2つのモデルは、次のようになります。

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.DataLookUpViewModel送信したら、すべてのバックエンドコードを処理するアクションメソッドにに渡してもらいたいです。唯一の問題は、LookUpViewModelアクションメソッドに渡されたものに、へのnull参照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
}       

長い投稿でごめんなさい。私はそれをシンプルに保つために最善を尽くしました。あなたが持っているかもしれないどんな提案も..発射します。

4

1 に答える 1

6

それを修正する2つの方法:

  1. Model.Searchable のすべてのプロパティに対して do HiddenFor() を追加できます。

  2. シリアル化を使用して、Model.Searchable をテキスト プレゼンテーションに転送し、コントローラーでシリアル化された形式から修復できます。

更新: 問題は: Html.HiddenFor(); ではなく、@Html.HiddenFor() を使用する必要があることです。

于 2012-08-22T18:05:36.030 に答える