【问题标题】:MVC Form in partial view submitting null部分视图中的MVC表单提交null
【发布时间】:2015-07-09 12:26:36
【问题描述】:

我在局部视图中有一个表单,可以正确显示我想要的数据。但是,当提交表单时,传递给控制器​​的模型为空。我不确定是否因为它是局部视图,所以一切似乎对我来说都是正确的。

局部视图

    @model CustomerPickUp.Web.Models.SalesOrderModel
    <h3 id="resultHeader">Search Results</h3>
    <div id="resultsContainer">
    <div id="container">
        <table class="resultTable">
            @using (Html.BeginForm("UpdateQueue", "Order", FormMethod.Post, new {id = "updateQueueForm"}))
            {
                @Html.ValidationSummary(true)
                for (var i = 0; i < Model.SalesOrderList.Count(); i++)
                {
                    <tr>
                        <td>
                            @Html.CheckBoxFor(it => Model.SalesOrderList[i].IsSelected)
                        </td>
                        <td style="text-align: right;">
                            @Html.Label("CustomerName", "Customer Name: ")
                            <br/>
                            @Html.Label("OrderNumber", "Order Number: ")
                        </td>
                        <td style="text-align: left;">
                            @Html.DisplayFor(it => Model.SalesOrderList[i].CustomerName)
                            @Html.HiddenFor(it => Model.SalesOrderList[i].CustomerName)
                            <br/>
                            @Html.DisplayFor(it => Model.SalesOrderList[i].OrderNumber)
                            @Html.HiddenFor(it => Model.SalesOrderList[i].OrderNumber)
                        </td>
                    </tr>
                }
            }
        </table>
    </div>
    </div>
    <div class="searchTypeSelection">

            @(Html.Kendo().Button()
          .Name("saveButton")
          .Content("Add to Queue")
          .HtmlAttributes(new {@class = "medium-btn"})
          .Events(e => e.Click("save_Clicked"))
          )
</div>

控制器

    public ActionResult UpdateQueue(SalesOrderModel SALESorder)
        {
            if (SALESorder.SalesOrderList != null)
            {
                foreach (SalesOrder item in SALESorder.SalesOrderList)
                {
                    if (item.IsSelected)
                    {
                        AddToOrderQueue(item);
                    }
                }
            }
            return RedirectToAction("Orders");
        }

主视图

    @{
        Layout = "~/Views/Shared/_CurrentQueueLayout.cshtml";
    }
    <div id="searchControls">
        @using (Ajax.BeginForm("ProcessSearch", "Search", new AjaxOptions { UpdateTargetId = "resultSection" }, new { id = "searchForm", @class = "pure-Form" }))
    {
        <div class="searchTypeSelection">
            @(Html.Kendo().DropDownList()
                  .Name("searchOption")
                  .DataTextField("Text")
                  .OptionLabel("Search By...")
                  .DataValueField("Value")
                  .BindTo(new List<SelectListItem>()
                  {

                      new SelectListItem()
                      {
                          Text = "SO Number",
                          Value = "2"
                      },
                      new SelectListItem()
                      {
                          Text = "Phone Number",
                          Value = "1"
                      }
                  })

            )
            <br />
            <br />
            <input type="text" id="searchString" name="searchString" disabled="disabled" />


            @(Html.Kendo().Button()
                  .Name("searchButton")
                  .Content("Search")
                  .Events(e => e.Click("search_clicked"))
                  .HtmlAttributes(new { @class = "medium-btn" })
            )
        </div>

    }
</div>
<div id="resultSection">


</div>
    <script type="text/javascript">
        $(document).ready(function () {
        //clear all fields
        $("#searchString").val("");
        $("#searchString").attr("disabled", "disabled");
    });
    $("#searchOption").change(function () {
        var dropdownlist = $("#searchOption").data("kendoDropDownList");
        var index = parseInt($("#searchOption").val());
        alert(index);
        if (dropdownlist.value() == 2) {
            $("#searchString").inputmask("************");
            $("#searchString").val("");
            $("#searchString").removeAttr("disabled");
        } else if (dropdownlist.value() == 1) {
            $("#searchString").inputmask("999-999-9999");
            $("#searchString").removeAttr("disabled");
            $("#searchString").val("");
        } else {
            $("#searchString").attr("disabled", "disabled");
            $("#searchButton").addClass("mobileButtonDisabled");
        }
    });

    $('#searchString').on('input', function () {
        var maskedtextbox = $("#searchString").val();
        var dropdownlist = $("#searchOption").data("kendoDropDownList");

        if ((dropdownlist.value() == 1 || dropdownlist.value() == 2) && maskedtextbox != "") {
            $("#searchButton").removeClass("mobileButtonDisabled");
        } else {
            $("#searchButton").addClass("mobileButtonDisabled");
        }
    });

    function search_clicked(e) {
        e.preventDefault();
        $("#searchForm").submit();
    };

    function save_Clicked(e) {
        e.preventDefault();
        $("#updateQueueForm").submit();
    };
</script>

更新

我更改了那个动作的签名,但这并没有改变任何东西。查看生成的 HTML 后,我注意到我的元素没有在表单中呈现。关于为什么的任何想法?

 <form id="updateQueueForm" method="post" action="/Order/UpdateQueue">  </form>
 <tbody>
 <tr>
<td>
<td style="text-align: right;">
<td style="text-align: left;">
<td>
<td style="text-align: right;">
<td style="text-align: left;">

【问题讨论】:

  • 保存按钮应该在表单中。它没有上下文。
  • 我手动调用表单提交,这是有效的。控制器动作被击中,只是传递了 null。
  • 函数 save_Clicked(e) { e.preventDefault(); $("#updateQueueForm").submit(); };
  • 将所有相关代码放入问题中。
  • 我更新了代码以包含主视图和 javascript。我之前有这段代码工作过,我能想到的唯一改变是我使用的是局部视图。如果我只使用 displayfor,则在您提交表单时不会为该字段提交任何值。

标签: asp.net asp.net-mvc asp.net-mvc-4 c#-4.0


【解决方案1】:

你在局部视图控制器中使用了错误的代码

public PartialViewResult UpdateQueue(SalesOrderModel SALESorder)
       {
         //
       }

也不确定你的按钮最好使用html提交按钮

【讨论】:

    【解决方案2】:

    看来我包裹表单的表格元素是原因。我敢肯定我以前做过,但最好还是以正确的方式做。感谢您的帮助,这就是我最终更改的内容。

      <div id="container">
        <div class="table">
            @using (Html.BeginForm("UpdateQueue", "Order", FormMethod.Post, new { id = "updateQueueForm", @class = "row" }))
            {
                @Html.ValidationSummary(true)
                for (var i = 0; i < Model.SalesOrderList.Count(); i++)
                {
                    <div class="cell">
    
                        @Html.CheckBoxFor(it => Model.SalesOrderList[i].IsSelected)
                    </div>
    
                    <div class="cell" style="text-align: right;">
                        @Html.Label("CustomerName", "Customer Name: ")
                        <br />
                        @Html.Label("OrderNumber", "Order Number: ")
    
                    </div>
    
                    <div class="cell" style="text-align: left;">
                        @Html.DisplayFor(it => Model.SalesOrderList[i].CustomerName)
                        @Html.HiddenFor(it => Model.SalesOrderList[i].CustomerName)
                        <br />
                        @Html.DisplayFor(it => Model.SalesOrderList[i].OrderNumber)
                        @Html.HiddenFor(it => Model.SalesOrderList[i].OrderNumber)
    
                    </div>
                }
            }
        </div>
    </div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      相关资源
      最近更新 更多