3

私は MVC 4 アプリケーションに取り組んでおり、ViewModel.

My ViewModel(詳細は後述) には oneComplexObjectOneと aが含まれますList<ComplexObjectTwo>

私のGET はデータベースから をActionResult正常に取り込み、すべてが my に正しく表示されます。ViewModelView

ComplexObjectOneandList<ComplexObjectTwo>POST に渡そうとすると、問題が発生しActionResultます。

ComplexObject正しく渡されますが、私が試したすべてがList<ComplexObjectTwo>コレクションの通過に失敗します。

私のComplexModelOneModel

public class Test
{
    public int Id {get;set;}
    public string Result {get;set;}

    public virtual ICollection<TestResult> TestResults {get;set;}
}

私のComplexModelTwoModel

public class TestResult
{
    public int Id {get;set;}
    public string Result {get;set;}
    public string Comment {get;set;}

    public virtual Test Test{get;set;}
}

じぶんのViewModel

public class TestingViewModel
{
    public TestingViewModel()
    {
        if(TestResults == null)
        {
            TestResults = new List<TestResult>();
        }
    }

    public Test Test {get;set;}
    public IEnumerable<TestResult> TestResults {get;set;}
}

私の Edit() GET ActionResult

public ActionResult Edit(int id = 0)
    {
        var viewModel = new TestingViewModel();

        Test test = testRepo.GetTestById(id);
        var results = test.TestResults;

        viewModel.Test = test;
        viewModel.TestResults = results;
        return View(viewModel);
    }

私の Edit()投稿 ActionResult

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(TestingViewModel model)
{
    // do update - left out for brevity
}

私のEdit.cshtmlView

@model Namespace.Models.ViewModels.TestingViewModel

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)


    @Html.EditorFor(model => model.Test, "TestHeader")

    <table>
        <tr>
            <th>Test</th>
            <th>Result</th>
            <th>Comment</th>
        </tr>
        @Html.EditorFor(model => model.TestResults, "TestResults")

    </table>

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

私のView中では、いくつかを使用しEditorTemplatesてプロパティ フィールドを表示します。

任意の支援、コメント、または提案をいただければ幸いです。Create() 手順で頼った複数のページではなく、単一のページでこれらのエンティティを更新できるようにしたいと考えています。

ありがとうございました、

パトリック H. (stpatrck)

4

1 に答える 1

1

交換:

@Html.EditorFor(model => model.TestResults, "TestResults")

と:

@Html.EditorFor(model => model.TestResults)

次に、EditorTemplates/TestResults.cshtmlエディター テンプレートの名前をEditorTemplates/TestResult.cshtml(欠落していることに注意してくださいs) に変更し、内部でモデル宣言を次のように置き換えます。

@model IEnumerable<TestResult>

に:

@model TestResult

ASP.NET MVC は、コレクションの各要素のテンプレートを自動的に呼び出すため、明らかに、このエディター テンプレートに記述した可能性のあるfororループを取り除くことになります。foreach

たとえば、次のようになります。

@foreach (var item in Model)
{
    @Html.EditorFor(x => item.SomeProperty)
}

単純に次のようになります。

@Html.EditorFor(x => x.SomeProperty)

生成されたマークアップを見て、入力フィールドの名前の違いに注目してください。あなたが持っていた前に:

<input type="text" name="item.SomeProperty" value="foo" />

そして今、あなたは持っています:

<input type="text" name="TestResults[0].SomeProperty" value="foo" />

フォームを POST アクションに送信すると、命名規則が尊重されるようになったため、既定のモデル バインダーはコレクションを正常にバインドできます。この規則の詳細については、 を参照してfollowing blog postください。

また、オブジェクト グラフに循環参照があり、正常にシリアル化およびモデル バインドできません。この循環依存を解消するには、ビュー モデルを使用する必要があります。

于 2013-09-11T15:05:29.500 に答える