MVC填充模型中的项集合

时间:2012-08-19 14:14:48

标签: asp.net asp.net-mvc-3

我刚开始学习MVC 3,我可以就实现某些目标的最佳方式提出一些建议。

我有一个基本场景,我可以创建一个包含一些文本和一组标记对象的博客文章。每个博客都可以有多个标签,每个标签都可以附加到多个博客上。

public class BlogPost
{
    public int ID { get; set; }
    public string BlogText { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public int ID { get; set; }
    public string TagText { get; set; }

    public virtual ICollection<BlogPost> Blogs { get; set; }
}

这将创建2个模型表,其中连接表为id expect。

最好的方法是在BlogPost模型的创建视图中添加一个部分,这样我就可以添加,编辑和删除一组标签(比如在索引视图中)?

我最初的想法是使用传递Model.Tags属性的标记对象的局部视图,但看起来Model属性为null。这是一种很好的方式,还是有更好的方法?


好的,创建视图的操作是生成的标准操作:

    // GET: /Blog/Create

    public ActionResult Create()
    {
        return View();
    }

视图代码如下:

@model MVC_ManyToManyTest.Models.BlogPost

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>BlogPost</legend>

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

        <div id="HolderForPartialView">
            @Html.Partial("ViewUserControl1", Model.Tags);
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

创建的局部视图是:

@model IEnumerable<MVC_ManyToManyTest.Models.Tag>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            TagText
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.TagText)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

</table>

我的问题

加载局部视图后,我在此行获得空引用:

@Html.Partial("ViewUserControl1", Model.Tags);

Model对象为null

2 个答案:

答案 0 :(得分:1)

模型为空,因为您的操作方法未在以下位置发送:

return View();

你需要给它一个带有空标签集的空模型。类似的东西:

var model = new BlogPost { Tags = new Collection<Tag>() };
return View(model);

或者,您也可以在模型构造函数中创建空集合:

public class BlogPost
{
    public BlogPost()
    {
        this.Tags = new Collection<Tag>();
    }

    public int ID { get; set; }
    public string BlogText { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
}

答案 1 :(得分:0)

我觉得你的代码应该是这样的,

public class MainModel
{
  public BlogPost MyBlogPost {get; set;}
  public Tags MyTags {get; set;}
}

第一次观看

@model MVC_ManyToManyTest.Models.MainModel

// Use model.MyBlogPost.variables here
...

@Html.Partial("ViewUserControl1", Model.Tags);

....

部分视图

@model IEnumerable<MVC_ManyToManyTest.Models.Tag>

// Use model.MyTags.variables here
...

我对此并不十分肯定,但我曾经遇到过类似的问题,我用这个解决了这个问题。希望这会有所帮助。