C# 通过Ajax.BeginForm实现MVC4过程模型

C# 通过Ajax.BeginForm实现MVC4过程模型,c#,jquery,asp.net-mvc,asp.net-mvc-4,razor,C#,Jquery,Asp.net Mvc,Asp.net Mvc 4,Razor,我试图按照这里的一些方法来实现这一点,但每次单击ajax回发时,控制器中的断点都会显示一个带有空值的模型。这个页面只显示供查看的模型值,但我尝试将它们放在自己的表单中,并将它们包装到ajax表单中,但似乎没有任何效果 @model VendorProfileIntranet.Models.VendorProfile $(function () { $("form").submit(function () { if ($(this).valid()) { $.ajax({

我试图按照这里的一些方法来实现这一点,但每次单击ajax回发时,控制器中的断点都会显示一个带有空值的模型。这个页面只显示供查看的模型值,但我尝试将它们放在自己的表单中,并将它们包装到ajax表单中,但似乎没有任何效果

@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;
});
}))

回答


由于使用DisplayFor,模型值没有绑定。如注释中所述,您实际上希望在模型中看到您使用DisplayFor在表单中输入的项
DisplayFor
字段不会发布,它们只是用于显示。为了将这些值发回,您需要为要发布的每个字段设置一个
HiddenFor
,以便模型绑定发挥作用,这很神奇。

您的表单中似乎缺少输入元素。@四十二有一个按钮,单击该按钮时,应将另一表单中的模型发回(未显示)并在db中插入一条记录,并在div标记中更新消息,表明它成功。我试着将所有表单元素放在ajax表单中,但这也不起作用,所以一个表单或两个表单都不起作用。我知道我遗漏了一些东西。你能发布你剩下的观点吗?@mattytomo见上图。我怀疑我设置一两个表单的方式有问题。就像我说的,我已经试过几种方法了。我们尝试了一种形式和两种形式。实际上,我完全按照您上面的建议进行了尝试(并再次尝试),当控制器断点被命中时,我的模型仍然为空(@Vic调试时Request.Form中有什么?很有意思…它只包含7个键,它有ProfileID(来自隐藏输入),在页面上剩余的24个模型项中,它只包含6个复选框值,这些值都是false(即使页面上的一个显示为true。这是因为所有内容都填充到一个表单中,并且没有修改jquery代码。@Vic请求。表单不会包含您拥有的
DisplayFor
for的其他值,您必须为每个值都拥有
HiddenFor
s才能进行模型绑定。如果您提交表单时没有jquery?啊,light Bubble moment.Thx。即使没有jquery,它的工作原理也是一样的。我正在研究将TextBoxFor与readonly一起使用的一种变体,它将显示所有字段并允许模型绑定(而不是同时使用DisplayFor和HiddenFor)
    @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");
    }