向部分视图传递一个模型?

4

这是我的部分内容:

@model RazorSharpBlog.Models.MarkdownTextAreaModel

<div class="wmd-panel">
    <div id="wmd-button-bar-@Model.Name"></div>
    @Html.TextAreaFor(m => m.Name, new { @id = "wmd-input-" + @Model.Name, @class = "wmd-input" })
</div>
<div class="wmd-panel-separator"></div>
<div id="wmd-preview-@Model.Name" class="wmd-panel wmd-preview"></div>

<div class="wmd-panel-separator"></div>

我试图像这样在我的View中包含它:
@using (Html.BeginForm())
{
    @Html.LabelFor(m => m.Title)
    @Html.TextBoxFor(m => m.Title)

    @Html.Partial("MarkdownTextArea", new { Name = "content" })

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

这些是模型类:

public class MarkdownTextAreaModel
{
    [Required]
    public string Name { get; set; }
}

public class BlogContentModel 
{
    [Required]
    [Display(Name = "Post Title")]
    public string Title { get; set; }

    [Required]
    [DataType(DataType.MultilineText)]
    [Display(Name = "Post Content")]
    public string Content { get; set; }
}

我做错了什么,我应该如何才能使我的部分重复使用?
2个回答

14

您的部分代码需要一个 MarkdownTextAreaModel 类的实例。因此,请这样做,而不是传递匿名对象,因为无论如何都会抛出异常:

@Html.Partial("MarkdownTextArea", new MarkdownTextAreaModel { Name = "content" })

现在,这样说来,一个更好的解决方案是调整你的视图模型,使其包含对MarkdownTextAreaModel的引用,并在视图中使用编辑器模板而不是部分视图,就像这样:

public class BlogContentModel 
{
    [Required]
    [Display(Name = "Post Title")]
    public string Title { get; set; }

    [Required]
    [DataType(DataType.MultilineText)]
    [Display(Name = "Post Content")]
    public string Content { get; set; }

    public MarkdownTextAreaModel MarkDown { get; set; }
}

然后当然需要调整为服务于该视图的控制器,以便填充你的视图模型中的 Markdown

public ActionResult Foo()
{
    BlogContentModel model = .... fetch this model from somewhere (a repository?)
    model.MarkDown = new MarkdownTextAreaModel
    {
        Name = "contect"
    };
    return View(model);
}

然后在您的主视图中简单地执行以下操作:

@using (Html.BeginForm())
{
    @Html.LabelFor(m => m.Title)
    @Html.TextBoxFor(m => m.Title)

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

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

然后为了遵循标准惯例,将您的部分移动到~/Views/YourControllerName/EditorTemplates/MarkdownTextAreaModel.cshtml,现在一切都会像它应该的那样神奇地发生。


太棒了!我在编码时正在学习MVC,所以这是很好的见解,谢谢! - bevacqua
我的部分视图需要一个长整型,我该如何传递它?使用 @model long,然后尝试这样做:@Html.Partial("p", new { m = Model.SWhCode }) - Akbari

0
@using (Html.BeginForm()) { 

    @Html.LabelFor(m => m.Title) @Html.TextBoxFor(m => m.Title)

    @Html.Partial("MarkdownTextArea", new MarkdownTextAreaModel { Name = "content" })

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接