2013-03-15 84 views
2

我试图在这里遵循一些good posts得到这个工作,但每次我点击ajax回发在我的控制器中的断点显示一个模型与空值。此页面仅显示用于查看的模型值,但我试图将它们放在自己的窗体中,并将​​它们封装在ajax窗体中,似乎没有任何工作。MVC4传递模型通过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> 
} 

控制器。我以一种或两种形式尝试了以上内容。通过上面的代码,模型包含除填充在隐藏输入字段中的ProfileID之外的所有空值。我认为传递模型应该不需要为每个模型值创建一个隐藏字段?

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

ANSWER

模型值不会由于使用的DisplayFor

+1

您似乎缺少输入元素在您的窗体' – 2013-03-15 18:52:39

+0

@四十二有一个按钮,单击时应传回其他形式的模型(未显示),并在db中插入记录并更新消息div标记它是成功的。我尝试将所有表单元素都放在ajax表单中,但这样也不起作用,所以一个表单或两个表单不起作用。我知道我错过了一些东西。 – SQLGrinder 2013-03-15 20:43:36

+0

你可以发表你的观点的其余部分吗? – mattytommo 2013-03-15 20:50:37

回答

7

正如在评论中指出绑定,你实际上希望看到你的模型,你有项目请使用DisplayFor填写表格。 DisplayFor字段不会发布,它们只是用于显示。为了将这些值发回,您需要为每个要发布的字段设置一个HiddenFor,以便模型绑定起作用。

+0

我试过一种形式和两种形式。我实际上已经完全按照上面的建议进行了尝试(并再次尝试),并且当控制器断点被击中时,模型仍为空。 :( – SQLGrinder 2013-03-15 21:18:08

+0

@Vic当你调试的时候Request.Form中有什么? – mattytommo 2013-03-15 21:29:20

+0

有趣......它只包含7个键,它具有ProfileID(来自隐藏输入)以及页面上其余的2打包含6个全部为false的复选框值(即使页面上的一个显示为true),这会将所有内容填充到一个表单中,而不会修改jquery代码 – SQLGrinder 2013-03-15 21:41:46