3

ASP.MVC 4 と Code First バインディングの子コレクションを理解できないようです。子コレクションに関しては、モデル オブジェクトが null であるというエラーが常に発生します。モデルがnullであるため、子コレクションがnullであるかどうかのチェックを追加することさえできません。

Batch オブジェクトを作成してそれにステップを追加すると、コントローラーで動作することを確認しました。

これは簡単なことだと思いますが、わかりません。

ここに私のオブジェクトがあります:

public class Batch
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual string Details { get; set; }
    public virtual ICollection<Step> Steps { get; set; }
}
public class Step
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual int Days { get; set; }
    public virtual Batch Batch { get; set; }
}

これが私のコントローラーアクションです:

    [Authorize]
    public ActionResult Create()
    {
        return View();
    }

これが私の見解です:

@model BC.Models.Batch

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

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

    <fieldset>
        <legend>Batch</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Details)
        </div>
        <div class="editor-field">
            @Html.TextAreaFor(model => model.Details)
            @Html.ValidationMessageFor(model => model.Details)
        </div>

        <div>
            <h3>Steps</h3>
            // Here is where I get a error that model is null
            @if(model.Steps != null)
            {
                foreach(var item in model.Steps)
                {
                    @Html.EditorFor(model => item)
                }
            }
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}
4

1 に答える 1

3

モデルをインスタンス化し、ビューに渡します。

public ActionResult Create()
        {
            var model = new Batch();
            return View(model);
        }

これにより、ビュー内の null モデルの NullReference 例外が解決されます。

ただし、Psot アクションに到達すると、Steps (Batch 内のコレクション) は null になる可能性があります。これを解決するには、次のようにコンストラクターでコレクションを新規作成します。

public class Batch
    {
        public Batch()
        {
            Steps = new Collection<Step>();
        }
        public virtual int Id { get; set; }
        public virtual string Title { get; set; }
        public virtual string Details { get; set; }
        public virtual ICollection<Step> Steps { get; set; }
    }
于 2012-12-18T21:07:38.760 に答える