Передать модель в частичный вид? - PullRequest
4 голосов
/ 13 сентября 2011

это мой частичный:

@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 голосов
/ 13 сентября 2011

Ваш частичный ожидает экземпляр класса 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, и теперь все волшебным образом встанет на свои места, как и должно быть.

0 голосов
/ 13 сентября 2011
@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" />
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...