2016-04-25 2 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) для модели частичного представления.

2) При вызове частичное представление в cshtml, убедитесь, что вы скажите MVC, где связывать содержание частичного Вид:

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

Обратите внимание, как мы используем TemplateInfo, чтобы установить правильный контекст для частично, поэтому входы, представленные в частичном, префиксны с правильными именами, чтобы сделать работу по созданию модели. Например. <input name="MyModel.FirstName"> Возможно, вы можете подделать это в javascript, но не спрашивайте меня, как это сделать.

3) Наши действия контроллера принимают ViewModel главной страницы. <form> находится на главной странице и окружает частичный вызов.

+0

Что вы будете делать, когда модель пуста в первый раз? Я попробовал то, что вы сказали, и создал MainModel с свойством MyModel. В исходном представлении я создал новый экземпляр MainModel и инициализировал опору MyModel. (т.е. новый MyModel()) Теперь, когда я отправляю данные, он не распознает никаких измененных значений. – PrivateJoker

+0

Я все еще подозреваю, что проблема заключается в том, что имя и идентификатор входов, отображаемых частичным, неверно префиксны (вы можете подтвердить это, проверив сгенерированный HTML). Можете ли вы попробовать вернуть обычный вид из «GetPerson»? Надеюсь, это решает проблему с префиксами, и вы можете сохранить исходный код и структуру модели. –

+0

Я все еще новичок в MVC, но я не уверен, какой префикс ожидать? Когда я рассматриваю представление, я вижу форму и ее идентификатор, и все поля преобразуют из входных элементов с именем и идентификатором, установленным в поле в модели. – PrivateJoker

Смежные вопросы