2013-03-15 3 views
2

Я попытался последовать за некоторым good posts здесь, чтобы заставить это работать, но каждый раз, когда я нажимаю ajax postback, точка прерывания в моем контроллере показывает модель с нулевыми значениями. На этой странице отображаются только значения модели для просмотра, но я попытался поместить их в свою форму, а также обернуть их в форме ajax и ничего не работает.MVC4 Pass модель через Ajax.BeginForm

@model VendorProfileIntranet.Models.VendorProfile 

$(function() { 
$("form").submit(function() { 
    if ($(this).valid()) { 
     $.ajax({ 
      url: this.action, 
      type: this.method, 
      data: $(this).serialize(), 
      success: function (result) { 
       $("#message").html(result); 
      } 
     }); 
    } 
    return false; 
}); 

});

@using (Ajax.BeginForm("SelectVendor", "Home", new AjaxOptions { HttpMethod="post", InsertionMode=InsertionMode.Replace, UpdateTargetId="message" })) 
{ 
    <div style="float:right; width:500px"> 
     <div id="message"></div> 
     <input id="btnSubmit" type="submit" value="Select Vendor" /> 
    </div> 

Вид действительно длинный (просто отображает значения модели для просмотра), сокращенно здесь.

<div id="viewform"> 
    <div id="viewform-contact" style="float:left;"> 
    <fieldset> 
     <legend>Contact Information</legend> 
     @Html.HiddenFor(model => model.ProfileID) 
     <div class="view-field"> 
      @Html.LabelFor(model => model.Name) 
      @Html.DisplayFor(model => model.Name) 
     </div> 
     <br /> 
     <div class="view-field"> 
      @Html.LabelFor(model => model.Email) 
      @Html.DisplayFor(model => model.Email) 
     </div> 
     <br /> 
     <div class="view-field"> 
      @Html.LabelFor(model => model.Phone) 
      @Html.DisplayFor(model => model.Phone) 
     </div> 
     <br /> 
     <div class="view-field"> 
      @Html.LabelFor(model => model.Website) 
      @Html.DisplayFor(model => model.Website) 
     </div> 
     <br /> 
     <div class="view-field"> 
      @Html.LabelFor(model => model.CompanyName) 
      @Html.DisplayFor(model => model.CompanyName) 
     </div> 
     <br /> 
     <div class="view-field"> 
      @Html.LabelFor(model => model.Address1) 
      @Html.DisplayFor(model => model.Address1) 
     </div> 
     <br /> 
     <div class="view-field"> 
      @Html.LabelFor(model => model.Address2)&nbsp; 
      @Html.DisplayFor(model => model.Address2) 
     </div> 
     <br /> 
     <div class="view-field"> 
      @Html.LabelFor(model => model.City) 
      @Html.DisplayFor(model => model.City) 
     </div> 
     <br /> 
     <div class="view-field"> 
      @Html.LabelFor(model => model.State) 
      @Html.DisplayFor(model => model.State) 
     </div> 
     <br /> 
     <div class="view-field"> 
      @Html.LabelFor(model => model.Zip) 
      @Html.DisplayFor(model => model.Zip) 
     </div> 
     <br /> 
     <div class="view-fieldwide"> 
      @Html.LabelFor(model => model.VendorNotes) 
     </div> 
     <br /> 
     <div class="view-fieldwide"> 
      @Html.DisplayFor(model => model.VendorNotes) 
     </div> 
     <br /><br /> 
     </fieldset> 
    </div> 
} 

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

[HttpPost] 
     public ActionResult SelectVendor(VendorProfile pageModel) 
    { 
     // handle selected vendor 
      _DAL.SelectVendor(pageModel.ProfileID); 
      return Content("This Vendor has been selected", "text/html"); 
    } 

ОТВЕТ

Значения модели не переплетены из-за использования Displayfor

+1

У вас, похоже, не хватает элементов ввода в вашей форме ' –

+0

@ Forty-Two Существует кнопка, которая при нажатии должна передать модель, которая является другой формой (не показана), и вставить запись в db и сообщение об обновлении в div, который был успешным. Я попытался поместить все элементы формы в форму ajax, и это тоже не сработало, поэтому одна форма или две формы не работали. Я знаю, что чего-то не хватает. – SQLGrinder

+0

Можете ли вы опубликовать остальную часть своего мнения? – mattytommo

ответ

7

Как было отмечено в комментариях, что вы на самом деле ожидали увидеть детали в вашей модели, что у вас есть положите в вашу форму, используя DisplayFor. DisplayFor поля не отправит, они просто для отображения. Чтобы отправить эти значения обратно, вам понадобится HiddenFor для каждого поля, которое вы хотите опубликовать, чтобы привязка модели к работе была волшебной.

+0

Я пробовал одну форму и две формы. Я на самом деле пытался точно указать то, что вы предложили выше (и попробовал еще раз), и моя модель по-прежнему равна нулю при ударе контрольной точки контроллера. :( – SQLGrinder

+0

@Vic Что есть в Request.Form, когда вы отлаживаете? – mattytommo

+0

Интересно ... Он содержит только 7 ключей, у него есть идентификатор ProfileID (из скрытого ввода) и оставшихся 2 дюжины элементов на странице из модели. содержит 6 значений флажка, которые являются ложными (хотя один на странице показывает true. Это происходит со всем, забитым в одну форму и не изменяющим код jquery. – SQLGrinder

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