2016-12-19 12 views
1

コントローラによってデフォルト値が指定されたTextAreaボックスを生成しようとしています。値レンダリングの空のボックスを持つMVC TextAreaFor

@{ 
    Html.RenderAction(
     "ContentBlock", "ContentBlock", 
      new TestSiteMvc.Models.ContentModel() { ContentID = 3 } 
     ); 
} 

部分図:

@Html.TextBoxFor(m=>m.Title) 
@Model.ContentHtml<br /> 
@Html.TextAreaFor(m => m.ContentHtml) 
@Html.TextBoxFor(m => m.ContentHtml) 
@Html.TextArea("ContentHtml2", Model.ContentHtml) 
@Model.ContentHtml<br /> 

レンダリング結果のHTMLは次のとおりです。

<input id="Title" name="Title" type="text" value="Home Title" /> 
Home Page Content<br /> 
<textarea cols="20" id="ContentHtml" name="ContentHtml" rows="2"></textarea> 
<input id="ContentHtml" name="ContentHtml" type="text" value="Home Page Content" /> 
<textarea cols="20" id="ContentHtml2" name="ContentHtml2" rows="2">Home Page Content</textarea> 
Home Page Content<br /> 

だから、ContentHtmlプロパティが読み込まなっている明らかだ部分図を呼び出してこのマークアップを考えます。私が理解していないのは、TextAreaForが空の値でレンダリングされている理由です。そして、明確にするために、同じIDを持つタグが付かないように、@Html.TextBoxFor(m => m.ContentHtml)という行を削除すると、問題は解決されません。

コントローラー:

[HttpGet] 
    public ActionResult ContentBlock(Models.ContentModel mcontent) { 

     mcontent = new Models.ContentModel() { 
      ContentID = 3, 
      ContentHtml = "Home Page Content", 
      Title = "Home Title" }; 
     return PartialView(mcontent); 
    } 

モデル:

public class ContentModel { 

    public int ContentID { get; set; } 
    public string Link { get; set; } 
    public string Title { get; set; } 
    public string ContentHtml { get; set; } 
    public DateTime LastModifiedDate { get; set; } 
} 
+0

これはまったく複製できません。 –

+0

コントローラコードはどこですか?問題の特定のviewmodelプロパティを使用してビューコードをテストし、それが機能しました、あなたは、テキストエリアのデフォルト値の問題をクリアするコントローラアクションメソッドを提供する必要があります。 –

+0

@ TetsuyaYamamoto、コントローラといくつかの追加コードを追加しました。ありがとう。 – InbetweenWeekends

答えて

1

あなたのGETメソッドは、モデルでパラメータを持っているので、DefaultModelBinderはデフォルト値でContentModel初期化し、3からContentIDの値を設定します。この時点で、すべての値はModelStateに加算されます(ModelStateContentHtmlの値はnull - stringのデフォルト値です)。プロパティの値を更新しても、ModelStateの値には影響しません。

ビューを返すと、@Html.TextAreaFor()は最初にModelStateをチェックします。この場合はnullであり、値はレンダリングされません。 (ModelStateの値が見つからない場合は、ViewDataをチェックし、最後にモデルプロパティの実際の値をチェックして何をレンダリングするかを決定します)。

@Html.TextArea("ContentHtml2", Model.ContentHtml)は、モデルプロパティにバインドされておらず、別のプロパティに基づいて値を設定するオーバーロードを使用しているため、機能します。

正しいアプローチ、及びこれを解決する最も簡単な方法は、最初としてModelState.Clear()を追加することができ、あるいは

@{ Html.RenderAction("ContentBlock", "ContentBlock", new { id = 3 }); } 

にビューコードを

public ActionResult ContentBlock(int id) 
{ 
    ContentModel model = new ContentModel() 
    { 
     ContentID = id, 
     ContentHtml = "Home Page Content", 
     Title = "Home Title" 
    }; 
    return PartialView(model); 
} 

に制御方法を変更して変更することですコードの行をModelStateからすべての値を削除します(​​メソッドはモデルプロパティから値を取得します)

+0

ありがとう!コントローラーを変更すると問題が解決しました。 – InbetweenWeekends

関連する問題