2011-09-12 12 views
2

これは私の部分である:モデルを部分ビューに渡しますか?

@model RazorSharpBlog.Models.MarkdownTextAreaModel 

<div class="wmd-panel"> 
    <div id="[email protected]"></div> 
    @Html.TextAreaFor(m => m.Name, new { @id = "wmd-input-" + @Model.Name, @class = "wmd-input" }) 
</div> 
<div class="wmd-panel-separator"></div> 
<div id="[email protected]" 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; } 
} 

私は何間違っている、私は私の部分的な再利用可能にするためにこれを行う必要がありますか?

答えて

13

あなたのpartialはMarkdownTextAreaModelクラスのインスタンスを想定しています。だからではなく、とにかく投げるでしょう匿名オブジェクトを渡すので、そうする:

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

は今、このビーイングは、はるかに良い解決策は、それがMarkdownTextAreaModelへの参照を含むように、あなたのビューモデルを適応させると、エディタのテンプレートを使用するだろうと述べ

public ActionResult Foo() 
{ 
    BlogContentModel model = .... fetch this model from somewhere (a repository?) 
    model.MarkDown = new MarkdownTextAreaModel 
    { 
     Name = "contect" 
    }; 
    return View(model); 
} 
01:それはあなたのビューモデルの MarkDownを移入するように、このビューを提供するコントローラをreadaptもちろん、その後

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; } 
} 

:だけではなく、そのようなあなたのビューでパーシャル、の

その後、単にあなたのメインビュー内部:

@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

yay!私はコーディング中のMVCを学んでいるので、これは素晴らしい洞察です、ありがとう! – bevacqua

+0

私の部分は長いと予想しますが、どうすればそれを渡すことができますか? '@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" /> 
} 
関連する問題