【问题标题】:MVC4 Pass model via Ajax.BeginForm通过 Ajax.BeginForm 的 MVC4 Pass 模型
【发布时间】:2013-03-15 18:49:48
【问题描述】:

我曾尝试在此处关注good posts 以使其正常工作,但每次我单击 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;
});

});

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

回答

由于使用了DisplayFor,模型值没有绑定

【问题讨论】:

  • 您的表单中似乎缺少输入元素'
  • @Forty-Two 有一个按钮,当单击该按钮时,应该返回另一种形式的模型(未显示)并在 db 中插入一条记录并在 div 标签中更新消息,表明它是成功的。我尝试将所有表单元素放在 ajax 表单中,但这也不起作用,所以一个或两个表单不起作用。我知道我错过了什么。
  • 你能发表你的观点吗?
  • @mattytommo 见上文。我怀疑我设置一两个表单的方式有问题。就像我说的那样,我已经尝试了几种方法。 THx

标签: c# jquery asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

正如 cmets 中所述,您实际上希望看到您使用 DisplayFor 放入表单中的模型中的项目。 DisplayFor 字段不会发布,它们只是为了展示。为了发回这些值,您需要为每个要发布的字段提供一个HiddenFor,以便模型绑定能够发挥作用。

【讨论】:

  • 我试过一种形式和两种形式。我实际上完全按照您上面的建议进行了尝试(并再次尝试),当控制器断点被命中时,我的模型仍然为空。 :(
  • @Vic 调试时 Request.Form 中的内容是什么?
  • 有趣...它只包含 7 个键,它具有 ProfileID(来自隐藏输入),并且在模型页面上剩余的 2 打项目中,它只包含 6 个复选框值,这些值都是错误的(即使页面上的一个显示为 true。这是将所有内容都塞进一个表单中,而不是修改 jquery 代码。
  • @Vic Request.Form 不会包含您拥有DisplayFor 的其他值,您必须为每个值拥有HiddenFors 才能进行模型绑定。如果您在没有 jquery 的情况下提交表单会发生什么?
  • 啊,灯泡时刻。谢谢。即使没有 jquery,它的工作原理也是一样的。我正在研究将 TextBoxFor 与 readonly 一起使用的变体,它将显示所有字段并允许模型绑定(而不是同时使用 DisplayFor 和 HiddenFor)
猜你喜欢
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多