【问题标题】:Controller not returning PartialView?控制器不返回 PartialView?
【发布时间】:2017-04-19 00:14:22
【问题描述】:

我有一个包含 if 语句的控制器,但它是否命中第一个或第二个块并不重要,因为它们都返回相同的类型。

[HttpPost]
public ActionResult Descriptions(string partsNo, Details searchValue)
{
    var response = partsNo != null ? _referenceRepository.GetParts(partsNo) : _referenceRepository.SearchValue(searchValue);

    return PartialView(response);
}

查看

@model ArrowEngineeringMVC.Models.Details

<script>
    $(document)
        .on("click",
            ".getPartNo",
            function (e) {
                var val = $(this).val();
                $.ajax({
                    url: '/Home/Descriptions',
                    contentType: 'application/json',
                    type: 'POST',
                    data: JSON.stringify({ "partsNo": val }),
                    dataType: 'html'
                })
                    .success(function (result) {
                        $('#descriptionPlace').html(result);
                    })
                    .error(function (xhr, status) {
                        alert(status);
                    });
            })
</script>

@using (Html.BeginForm("Descriptions", "Home", FormMethod.Post))
{
    <div class="topBar">
        @Html.TextBoxFor(m => m.Type)
        <input type="submit" id="submitId" value="submit"/>
    </div>
}

    <div class="leftPanel">
        <button href="javascript:void(0)" id="NumbersButton" value="Number" class="getPartNo">#</button>
        <button href="javascript:void(0)" value="A" class="getPartNo">A</button>
        <button href="javascript:void(0)" value="B" class="getPartNo">B</button>
        <button href="javascript:void(0)" value="C" class="getPartNo">C</button>
    </div>

    <div id="descriptionPlace"></div>

如果您单击其中一个按钮,它将点击 if 语句的第一部分。如果您这样做,则返回一个 PartialView 并且一切正常,按钮的值正在使用 AJAX 传递给控制器​​,而如果您进行搜索,它是通过模型传递的,这是唯一的区别。

如果您进行搜索,它会遇到不返回部分视图的 if 语句的第二部分,它只是出于某种原因返回一个新视图。

我只是感到困惑,因为变量 response 返回一个列表,但根据您点击的 if 语句的哪个部分包含不同的值。

这里有一点 referenceRepository 只是为了更容易理解:

public List<Parts> SearchValue(Details searchValue)
{
    const string detailsSql = "SELECT [ID], [Description] FROM Table1 WHERE [Type] = {0}";
    string queryDetails = string.Format(detailsSql, searchValue.Type);

    var dbDetails = getConnection().Query<Parts>(queryDetails).ToList();

    return dbDetails;
}

public List<Parts> GetParts(string partNumber)
{
    string partsSql;
    if (partNumber == "Number")
    {
        partsSql = "SELECT [ID], [Description] FROM Table1 WHERE [Part Number]  not like '%[^0-9]%'";
    }
    else
    {
        partsSql = "SELECT [ID], [Description] FROM Table1 WHERE [Part Number] like '{0}%'";
    }

    string queryParts = string.Format(partsSql, partNumber);

    var dbParts = getConnection().Query<Parts>(queryParts).ToList();

    return dbParts;
}

【问题讨论】:

  • @GSerg Details 是我创建的一个对象,其中包含一个名为 Type 的属性,我将整个模型发布回控制器,并且 Type 属性将被填充
  • 我想我误解了你的问题描述。显然你是说表单返回的部分视图替换了整个页面,而不是进入#descriptionPlace。没错,当您提交表单时,浏览器会将它返回的任何内容显示为新页面。它不知道这不是一个“完整的”视图。如果您希望表单发布的结果进入#descriptionPlace,您需要像拦截clicks 一样拦截表单的submit,或者使用带有适当参数的Ajax.BeginForm
  • @GSerg 哦,是的,谢谢你,你知道我将如何使用@Html.BeginForm 将它渲染到#descriptionPace 中吗?
  • 您将为表单的submit 事件创建另一个事件处理程序,就像您为按钮的click 事件创建的事件处理程序一样。或者你会使用@Ajax.* methods

标签: c# model-view-controller partial-views


【解决方案1】:

如果您希望在提交点击时获得与#descriptionPlace div 中的部分视图相同的结果。那么您可以尝试像这样删除表单标签。并将提交按钮的点击事件与那些 getnumbers 按钮绑定..

不需要发布一个值?我说的对吗?

如果您想具体在 div 或特定区域中加载部分视图,那么您必须提及 ajax 调用。或者您可以使用 @Html.Partial 或 RenderPartial。但是您的要求有点奇怪。所以你可以这样尝试..

【讨论】:

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