Asp.net mvc PartialView重定向而不是插入

Asp.net mvc PartialView重定向而不是插入,asp.net-mvc,asp.net-mvc-4,razor,Asp.net Mvc,Asp.net Mvc 4,Razor,我的razor页面上有一个表单和一个局部视图,其想法是,如果我更改dropdownlist,控制器将执行一些工作,并设置一个ViewBag.ShowAlert bool,以触发要显示的局部视图 虽然这是可行的,但部分视图不是仅在部分视图中显示代码,而是显示为新视图,而不是在同一视图中 知道为什么吗 景色是这样的 @using (Html.BeginForm("AlterVote", "ChangeVoteType")) { @Html.AntiForgeryToken() <div

我的razor页面上有一个表单和一个局部视图,其想法是,如果我更改dropdownlist,控制器将执行一些工作,并设置一个ViewBag.ShowAlert bool,以触发要显示的局部视图

虽然这是可行的,但部分视图不是仅在部分视图中显示代码,而是显示为新视图,而不是在同一视图中

知道为什么吗

景色是这样的

@using (Html.BeginForm("AlterVote", "ChangeVoteType"))  
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
    <h1>New voting preference</h1>
    <hr />

    <p>Please select the type of vote you wish to change to @Html.DropDownListFor(model=>model.SelectedType, ViewBag.myList as SelectList, "Voting type", new { onchange = "this.form.submit();"})</p>

    <div id="partialDiv">
        @if (ViewBag.ShowAlert)
        {
            @Html.Partial("VotingChange")
        }
    </div>
</div>
}

我猜这是由于最初的视图是一个表单,因此分部会对在何处插入视图感到困惑。

如果我理解正确,分部视图显示为一个新视图,您的意思是它再次带有html标记、主体和完整布局。要解决此问题,需要在局部视图中将布局设置为null,如下所示:

@model YourNamespace.Dropdown

@{
    Layout = null;
}

<!-- partial view html below -->
<div>
</div>
div标签只是为了举例说明

虽然这可能会解决您的问题,但您可能希望在不重新加载整个页面的情况下加载部分视图。这可以使用ajax实现,如下所示:

@model YourNamespace.Dropdown

@{
    Layout = null;
}

<!-- partial view html below -->
<div>
</div>
主视图

因此,我只是添加了一个javascript来监听Drop溺水上的相同更改事件,但我没有提交表单,而是使用ajax加载部分视图html,而不重新加载整个页面


只需修复URL,并记住在局部视图中将布局设置为null。此外,您可能希望将此javascript放在一个单独的文件中,从而将其与捆绑包一起加载。

onchange=this.form.submit;这将触发表单提交,并随后导航到新视图。您需要触发一个AJAX请求并处理响应以更新页面元素partialDiv。这是一个很酷的答案-谢谢。但我现在遇到的问题是ChangeVoteTypeController/AlterVote给出了一个404,它位于服务器的根目录上,所以完整的[测试]url是127.0.0.1:8080/ChangeVoteTypeController/AlterVote。AlterVote在中设置为[HttpPost]controller@Nodoid由于它是HttpPost,您不能只在浏览器中打开url,因此asp.net mvc的预期行为是提供404,因为它根本找不到get操作。您可以临时将操作更改为HttpGet,也可以删除下拉参数并使用固定值进行测试,然后使用浏览器进行检查。然后再次将其更改为HttpPost put参数,并测试javascript方法。如果是同一台服务器,您只需将/ChangeVoteTypeController/AlterVote设置为url,并检查浏览器控制台是否存在错误。
@using (Html.BeginForm("AlterVote", "ChangeVoteType"))  
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
    <h1>New voting preference</h1>
    <hr />

    <p>Please select the type of vote you wish to change to @Html.DropDownListFor(model=>model.SelectedType, ViewBag.myList as SelectList, "Voting type", new { id = "vote"})</p>

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

<script type="text/javascript">
  $(document).ready(function () {
    $('#vote').change(function() {
        var selectedType = $(this).val();
        $.post('yourserver/YourController/AlterVote', { "SelectedType": selectedType })
        .done(function (data) {
            $('#partialDiv').html(data);
        })
        .fail(function () {
            console.log('Whoops, something went wrong!!!');
        });
    });
  });
</script>