我使用的是Visual Studio 2013, . net 4.5, MVC和Visual Basic。我试图在使用jQuery和Ajax的另一个视图的空div中呈现部分视图。我的脚本在下拉列表更改上成功运行,我的部分视图被渲染,但不是在同一视图上的div中渲染,而是在自己的页面上渲染。
主要观点:
<div class="col-md-8">
<div class="btn-group">
<button class="btn btn-default dropdown-toggle btn-sm" type="button" id="dropDownSelectBuilding" data-toggle="dropdown"
aria-expanded="true">
<span class="selection"></span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu" aria-labeledby="dropDownSelectBuilding">
@For Each item In Model
Dim currentItem = item
@<li role="presentation"><a role="menuitem" tabindex="-1" href="/LocationSelect/SelectFloor"
>@Html.DisplayFor(Function(modelItem) currentItem)</a></li>
Next
</ul>
</div>
@section Scripts
<script>
$('#dropDownSelectBuilding').onChange(function () {
$.ajax({
url: '/LocationSelect/SelectFloor',
contentType: 'application/html; charset=utf-8',
type: 'GET',
dataType: 'html'
})
.success(function (result) {
$('#showFloors').html(result);
})
.error(function (xhr, status) {
alert(status);
})
});
</script>
End Section
</div>
</div>
<div class="row" id="showFloors">
</div>
部分观点: <div class="col-md-4">
<label>*Select the floor this item will move to:</label>
</div>
<div class="col-md-8">
<div class="btn-group">
<button class="btn btn-default dropdown-toggle btn-sm" type="button" id="dropDownSelectFloorMoveTo" data-toggle="dropdown" aria-expanded="true">
<span class="selection"></span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu" aria-labeledby="dropDownSelectFloorMoveTo">
@For Each item In Model
Dim currentItem = item
@<li role="presentation"><a role="menuitem" tabindex="-1" href="/LocationSelect/SelectFloor"
>@Html.DisplayFor(Function(modelItem) currentItem)</a>
</li>
Next
</ul>
</div>
</div>
控制器:
Public Class LocationSelectController
Inherits Controller
Private db As New MCSCInventoryModels
' GET: LocationSelect
Function Index() As ActionResult
Dim distinctBuildings = From Row In db.tblLocations
Select Row.Building
Distinct
Return View(distinctBuildings)
End Function
' GET: FloorS
Function SelectFloor(ByVal selectedBuilding As String) As PartialViewResult
Dim floorsInSelectedBuilding = From Row In db.tblLocations
Where Row.Building = selectedBuilding
Select Row.Floor
Distinct
Return PartialView(floorsInSelectedBuilding)
End Function
End Class
你能告诉我为什么这个ajax调用在它自己的页面中打开部分视图,而不是在指定的div中渲染它?
Update我已经检查了这两个问题的公认答案,他们没有解决问题。在这里和
你很可能在你的布局页面中错过了不显眼的脚本。
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
参考这个问题:
为什么局部视图显示为完整的页面在MVC 5 Visual Studio 13?
还有一件事是添加最后一行(UnobtrusiveJavaScriptEnabled)到你的配置文件(Web.Config):
<configuration>
<appSettings>
<add key="webpages:Version" value="2.0.0.0"/>
<add key="webpages:Enabled" value="false"/>
<add key="PreserveLoginUrl" value="true"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
导致这个问题的最终原因是我使用了非传统的下拉菜单。为了解决这个问题,我向<a role="menuitem">
添加了一个class
,如下所示:
@<li role="presentation"><a class="ddlist" role="menuitem" tabindex="-1" href="#"
>@Html.DisplayFor(Function(modelItem) currentItem)</a></li>
,然后使用:
$('.ddlist').click(function () {
触发ajax调用。
我还删除了从设计阶段遗留下来的href="/LocationSelect/SelectFloor"
,并导致部分视图在自己的页面中打开,当选择时,ajax没有被触发。