【问题标题】:MVC3 Ajax.BeginForm not returning specific partialviewMVC3 Ajax.BeginForm 不返回特定的部分视图
【发布时间】:2012-09-06 02:57:16
【问题描述】:

从 Ajax.BeginForm 方法调用 PartialView 时,我无法返回它。 Ajax 调用如下。

@{
    ViewBag.Title = "ChargeCode 1";
    Layout = "~/Views/Shared/_Search_Layout.cshtml";
}

<div class="span9">
    <div class="page-header">
        <h1>Charge Code1</h1>
    </div>
        @using (Ajax.BeginForm("SearchChargeCode1", "ChargeCodeSearch", new AjaxOptions
        {
            UpdateTargetId = "searchResults",
            HttpMethod = "GET",
            InsertionMode = InsertionMode.Replace,
        }))
        {

            <input type="text" name="chargeCode1" class="input-medium search-query" />

            <input type="submit" class="btn" value="Search" />
            <button type="button" class="btn">Clear Results</button>

        }

    <table id="searchResults">

    </table>
</div>

在文本框中输入参数后,我单击提交按钮,然后它会将我带到 ChargeCodeSearchController 中的 SearchChargeCode1 partialviewresult 方法

public PartialViewResult SearchChargeCode1(string chargeCode1)
{
var chargecodes1 = db.ChargeCodes.Where(c => (!(String.IsNullOrEmpty(chargeCode1)) && c.NameChargeCode.Contains(chargeCode1))).Take(10);

return PartialView("ChargeCodeSearch/_FindChargeCodeSearchResults1", chargecodes1);
}

应该然后返回位于 Views 文件夹中以下位置的 _FindChargeCodeSearchResults1 视图:

Views  
->Shared  
->->ChargeCodeSearch  
->->->_FindChargeCodeSearchResults1

没有!

我在 PartialViewMethod 中放置了一个断点。它能够查询并找到一个结果列表并将其分配给chargecodes1变量,但是在它逐步执行代码的返回行之后,它只是返回到包含Ajax的视图,但它不会插入部分视图更新目标“searchResults”中的“ChargeCodeSearch/_FindChargeCodeSearchResults1”。

我在 Shared 下有一个 FirmSearch 和 MemberSearch 文件夹,它们执行完全相同的功能,但对象不同。那些工作。我不知道为什么这不起作用。

下面是应该返回的视图_FindChargeCodeSearchResult1的代码sn-p。创建此 cshtml 视图时,我将其创建为 PartialView。我没有为它分配母版页,也没有将它强输入到 ChargeCode 对象中。

@model IEnumerable<MLSMAS.Models.ChargeCode>
<table id="searchResults" class='table table-striped table-bordered table-condensed'>
    <thead>
        <tr>
            <th>ChargeCode ID</th>
            <th>ChargeCode Name</th>
            <th>ChargeCode Price</th>
            <th>Frequency</th>
            <th>ChargeCode Description</th>
            <th>Select</th>
        </tr>
    </thead>
    <tbody>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.IdChargeCode)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.NameChargeCode)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Frequency)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DescChargeCode)
            </td>
            <td>
               <a href="" onclick="setChargeCode1('@item.IdMember' '@item.Price');" class="setChargeCode1">Select</a>
            </td>
         </tr>
    }   
    </tbody>
</table>
<script src="../../../Scripts/MLSMASJS.js" type="text/javascript"></script> 

非常感谢任何帮助或建议。

【问题讨论】:

  • 您能在 FireBug/IE-Chrome 开发控制台中查看您的 ajax 请求的响应是什么吗?顺便说一句,您应该将&lt;table id="searchResults"&gt; 更改为&lt;div id="searchResults"&gt;,因为您的部分中已经有&lt;table&gt;

标签: c# asp.net-mvc-3 asp.net-ajax asp.net-mvc-partialview


【解决方案1】:

Ajax.BeginForm 调用的操作不会返回任何部分视图,它会重新运行字符串,为此您需要捕获 PartailView RenderHtml,因为 ParttailView 的返回类型是字符串。

在控制器中

public string SearchChargeCode1(string chargeCode1)
{
var chargecodes1 = db.ChargeCodes.Where(c => (!(String.IsNullOrEmpty(chargeCode1)) && c.NameChargeCode.Contains(chargeCode1))).Take(10);

string RenderHtml = RenderPartialViewToString("ChargeCodeSearch/_FindChargeCodeSearchResults1", chargecodes1);

 return RenderHtml ;
}


protected string RenderPartialViewToString(string viewName, object model)
        {
            if (string.IsNullOrEmpty(viewName))
                viewName = ControllerContext.RouteData.GetRequiredString("action");

            ViewData.Model = model;

            using (StringWriter sw = new StringWriter())
            {
                ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
                ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
                viewResult.View.Render(viewContext, sw);
                return sw.GetStringBuilder().ToString();
            }
        }

RenderPartialViewToString 方法返回部分视图的 HtmlString。并将结果附加到 AjaxBeginForm "UpdateTargetId" 属性的指定位置。

【讨论】:

  • 谢谢!我试过了,它奏效了。它还暴露了一些阻止我的原始代码工作的原因。我引用了一个不属于 ChargeCode 类的属性。
猜你喜欢
  • 2020-04-27
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多