2016-04-25 7 views
1

私はビューを持っており、そのビューの内部には部分ビューを含むdivがあります。MVC5でビューモデルを部分ビューで更新するにはどうすればよいですか?

私の問題はこれです。ユーザーがドロップダウンリストから項目を選択すると、モデルで部分図を読み込みます。ユーザーの変更によって、テキストボックスの一部が変更され、ボタンがクリックされて部分ビュー(Html.BeginFormにあります)が送信されます。

コントローラのモデルを調べると、モデルにはユーザーが行った変更が含まれていません。

モデルにはユーザーが行った変更が反映されないのはなぜですか?メインビューで

<div id="personInfo" style="display:none;"></div> 

マイ部分図:

@model MyProject.MyModel 

    @(Html.Kendo().DropDownList().Name("ddlFilters") 
           .AutoBind(true) 
           .OptionLabel("--- Select Filter ---") 
           .DataValueField("ID") 
           .DataTextField("MYFILTER") 
           .DataSource(ds => 
            ds.Read(r => r.Action("GetPersonFilters", "Home")) 
           ) 
           .Events(x => x.Select("ddlFilters_onSelect")) 
         ) 

    @using (Html.BeginForm("PersonAction", "Home", FormMethod.Post, new { @class = "form-horizontal", id = "personForm" })) 
      { 
       // Strongly typed Kendo fields. Several DropDownListFor and TextBoxFor 
       @Html.Kendo().TextBoxFor(x => x.FirstName).HtmlAttributes(new { @class = "form-control kendoTextBox required " }) 
       // Button to post the form data to the controller. 
      } 

マイJavascriptを:

function ddlFilters_onSelect(e) { 
    var itm = this.dataItem(e.item); 

    clearForm(); 

    if (itm.ID > 0) { 
     // Ajax call to get data.... 
     $.ajax({ 
      url: "/Home/GetPerson", 
      type: "GET", 
      data: { "myID": itm.ID } 
     }) 
     .done(function (result) { 
      //var aaa = data;  
      $("#personInfo").html(result); 
     }) 
     .fail(function (xhr, status, err) { 
      alert(xhr.responseText); 
     }); 
    } 
}; 

モデル:

public partial class MyModel 
    { 
     public decimal ID { get; set; } 
     public string FirstName{ get; set; } 
     public string LastName{ get; set; } 
     public string MiddleName{ get; set; } 
    } 

EDIT: コントローラコード:

// Initial call to main view 
    public ActionResult CreateNewPerson() 
    { 
     return View(); 
    } 

    // Call to load Partial View initially 
    public PartialViewResult GetPersonInfo() 
    { 
     return PartialView("_PersonForm", new MyModel()); 
    } 

    // Call to load partial view with data 
    public PartialViewResult GetPerson(int myID) 
    { 
     myData = GetFromDB(myID); 
     return PartialView("_PersonForm", myData); 
    } 

    // Method to save partial form 
    [HttpPost] 
    public ActionResult PersonAction(MyModel filter) 
    {   

     if (ModelState.IsValid) 
     { 
      // Go update DB 
     } 

     return View("CreateNewPerson"); 
    } 
+1

コントローラコードを投稿できますか? –

答えて

0

これは、あなたが説明した正確なシナリオではありませんが、これは私のチームは、パーシャルを使用する方法である:

1)のViewModelでは、あなたのメインビューのために、プロパティを追加(例えばMyModel)を部分ビューのモデルに追加します。我々はのための右のコンテキストを設定するTemplateInfoを使用する方法

@Html.Partial("_PersonAction", Model.MyModel, new ViewDataDictionary(Html.ViewData) { 
     TemplateInfo = new TemplateInfo { HtmlFieldPrefix = Html.NameFor(m => m.MyModel).ToString() } 
    }) 

注:CSHTMLに部分ビューを呼び出すとき

2)、あなたはどこパーシャルビューの内容をバインドするにはMVCを伝えることを確認してください部分的なので、部分的にレンダリングされた入力には正しい名前が前置され、モデル結合の作業を行います。例えば。 <input name="MyModel.FirstName"> これはおそらくjavascriptでこれを偽造することができますが、私にどのように聞かないでください。

3)コントローラのアクションは、メインページのViewModelを受け入れます。 <form>はメインページにあり、部分呼び出しを囲んでいます。

+0

初めてモデルが空のときはどうしますか? あなたが言ったことを試して、MyModelのプロパティを持つMainModelを作成しました。最初のビューでは、MainModelの新しいインスタンスを作成し、MyModelの小道具を初期化しました。 (すなわち、新しいMyModel()) 私はデータを投稿するために行くとき、変更された値を認識しません。 – PrivateJoker

+0

私はまだ問題は、部分によってレンダリングされた入力の名前とIDが正しくプレフィックスされていないことです(生成されたHTMLを調べることでこれを確認できます)。あなたは 'GetPerson'から通常のビューを返そうとしますか?うまくいけば、これは接頭辞の問題を解決し、元のコードとモデルの構造を維持することができます。 –

+0

私はまだMVCを初めて使い慣れていますが、プレフィックスはどのようなものか分かりません。ビューを調べると、フォームが表示され、IDであり、すべてのフィールドが、モデルのフィールドに設定された名前とIDを持つ入力要素を変換します。 – PrivateJoker

関連する問題