【问题标题】:Empty POST model argument when using EditorFor使用 EditorFor 时为空 POST 模型参数
【发布时间】:2018-07-10 02:40:06
【问题描述】:

我正在尝试提交包含@Html.EditorFor 元素的表单。如果我删除 EditorFor 元素,我的 POST 控制器参数会正确传递数据,但一旦实现,我的整个模型参数在 POST 控制器中显示为 null

这是我试图通过的模型:

public class Checkout
{
    public int CheckoutID { get; set; }
    public string Requestor { get; set; }
    public DateTime? DateRequested { get; set; }
    public List<CheckoutReceiver> Receivers { get; set; }
}

页面上的表单元素:

@model PRI.Models.Checkout

@using (Html.BeginForm("CreateCheckout", "API/CheckoutRequest", FormMethod.Post, new { id = "pri-form" }))
{
    <div id="checkout-request">
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div id="checkout-info" class="form-horizontal">
            <div class="form-group">
                <div class="col-md-12">
                    @Html.TextBoxFor(m => m.CheckoutID)
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-12">
                    @Html.EditorFor(m => m.Receivers)
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-12">
                    <input id="create-checkout-submit" type="submit" value="Confirm transfer" class="btn btn-danger right" style="margin: 10px;" />
                </div>
            </div>
        </div>
    </div>
}

如果我删除 @Html.EditorFor(m =&gt; m.Receivers),并将数据添加到 @Html.TextBoxFor(m =&gt; m.CheckoutID),那么它会正确传递给我的 Post Controller,所以显然我的 EditorFor 搞砸了:

这是 POST 控制器(我在它进入后立即设置了一个断点,以便我可以检查 checkout 参数):

[System.Web.Http.HttpPost]
[ValidateAntiForgeryToken]
[System.Web.Http.ActionName("CreateCheckout")]
public Checkout Create(Checkout checkout)
{

    var request = new Checkout();

    return request;
}

这是我的 CheckoutReceiver 编辑器模板(为简洁起见,删除了一些输入元素):

@model PRI.Models.CheckoutReceiver

@using (Html.BeginCollectionItem("Receivers"))
{
<div class="form-horizontal">
    @Html.HiddenFor(model => model.ID)
    @Html.HiddenFor(model => model.CheckoutID)

    <h4 class="contact-header">@Model.ContactType</h4>

    <div class="form-group">
        <div class="col-md-5">
            <span class="form-header">Last Name</span>
            @Html.TextBoxFor(model => model.LastName, new { @class = "box-customer form-control ignore", placeholder = "Last name" })
        </div>
        <div class="col-md-5">
            <span class="form-header">First Name</span>
            @Html.TextBoxFor(model => model.FirstName, new { @class = "form-control ignore", placeholder = "First name" })
        </div>
        <div class="col-md-2">
            <span class="form-header">Middle Initial</span>
            @Html.TextBoxFor(model => model.MiddleInitial, new { @class = "form-control ignore", placeholder = "M.I." })
        </div>
    </div>
    </div>
    }

我哪里出错了,为什么我的EditorFor 导致我的Checkout POST 参数在提交时为空?

谢谢!

【问题讨论】:

  • 您是否在视图中动态添加和删除CheckoutReceiver 项目(这是BeginCollectionItem 方法的用途),在这种情况下,您在foreach 循环中使用@Html.Partial() 和将每个项目传递给部分。如果没有,请删除 BeginCollectionItem
  • @StephenMuecke 感谢这个问题,显然它与尝试将复杂模型发布到 ApiController 而不是普通控制器有关。我认为我的格式不正确,但将操作放在普通控制器中按计划工作

标签: c# asp.net-mvc


【解决方案1】:

也许你应该检查this question。您应该为IEnumerable&lt;CheckoutReceiver&gt; 添加一个编辑器,而不是为CheckoutReceiver 添加一个编辑器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多