在 MVC 5 中,返回具有指定名称的视图是在 <pre> 标记内返回整个页面

Posted

技术标签:

【中文标题】在 MVC 5 中,返回具有指定名称的视图是在 <pre> 标记内返回整个页面【英文标题】:In MVC 5, returning a View with a specified name is returning the entire page within a <pre> tag 【发布时间】:2022-01-07 11:11:13 【问题描述】:

请耐心等待,我已经多年没有使用 MVC 了,所以我很生疏。但我发誓这曾经有效。我有一个使用布局页面的视图。布局页面中有几个表单,以防万一。

Body 视图包含一个网格和一些辅助数据。在网格的单击事件上,我使用 javascript 提交正文中的表单。

跟踪控制器代码,一切看起来都不错,模型在代码中看起来不错,但它在客户端中呈现在 pre 标记中。

我终其一生都无法弄清楚我做错了什么,而且我的搜索也没有找到任何相关的内容。任何帮助将不胜感激!由于我的头撞到桌子上,我慢慢地在我的桌子上穿了一个草皮。

我已经删除了很多格式垃圾。希望它不相关;我怀疑我在做一些根本错误或过时的事情。

查看页面源,它​​显示了常规页面源:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Facilities</title>
</head>
<body>
    ...
</body>
</html>

调出开发者工具,显示pre标签:

<html>
    <head></head>
    <body>
        <pre style="word-wrap: break-word; white-space: pre-wrap;">
            "<!DOCTYPE html><html><head><meta charset="utf-8" /><meta name="viewport" "
            ...
        </pre>
    </body>
</html>

 控制器:

public ActionResult Facilities(int selectedFacility = 0, string selectedFacilityName = "")

    // builds model, sets values
    return View("Facilities", model);


[HttpPost]
public ActionResult SelectFacility(int selectedFacility)

    // Gets selected facility name

    // Originally tried creating a new view model, updating the 
    //    two values and displaying like this:
    // return View("~/views/account/Facilities.cshtml", model);

    // Currently trying this:
    return Facilities(selectedFacility, facilityName);

ViewModel(不过我认为它不太相关):

public class FacilitiesViewModel
    
        public string UserId  get; set; 
        public int SelectedFacility  get; set; 
        public string SelectedFacilityName  get; set; 
        public List<Facility> FacilityList  get; set; 
        public int? DefaultFacility  get; set; 
        public string DefaultFacilityName  get; set; 
    

查看:

@model FacilitiesViewModel
@using NonFactors.Mvc.Grid
@
    ViewBag.Title = "Facilities";
    Layout = "~/Views/Shared/_LayoutWithMenu.cshtml";


<div>
    <div>
        Facilities
    </div>
    @using (Html.BeginForm("SelectFacility", "Account", FormMethod.Post, new  name = "frmFacilities", id = "frmFacilities" ))
    
        @Html.AntiForgeryToken()
        <div class="table-responsive" id="tblFacilities">
            @(Html
                .Grid(Model.FacilityList)
                .Build(columns =>
                
                    columns.Add(model => model.FacilityId).Css("d-none");
                    columns.Add(model => model.FacilityName).Titled("Name").Css("text-start");
                    columns.Add(model => model.City).Titled("City").Css("text-start");
                    columns.Add(model => model.State).Titled("State").Css("text-start");
                )
                .Empty("No data found")
                .Filterable()
                .Sortable()
                .Pageable())
        </div>
        @Html.HiddenFor(m => m.SelectedFacility, new  @id = "SelectedFacility" ) 
        @Html.HiddenFor(m => m.DefaultFacility)
    
</div>

<script>
    function gridSelect(e) 
        if (e.detail.data["client-id"] == null) return;
        
        $("#SelectedFacility).val(e.detail.data["client-id"]);
        $("#frmFacilities").submit();
    
</script>

【问题讨论】:

【参考方案1】:

如果您使用 Javascript 发布帖子并且它正在返回内容以放入页面上的占位符中,那么您需要返回 PartialView() 而不是返回 View()。

View 总是返回您的 _layout.cshtml 与视图混合,因此您再次获得完整的 html 正文。 PartialView 只发回没有 _layout.cshtml 的视图

【讨论】:

以上是关于在 MVC 5 中,返回具有指定名称的视图是在 <pre> 标记内返回整个页面的主要内容,如果未能解决你的问题,请参考以下文章

具有相同名称的 MVC 视图问题/错误

在 MVC 5 应用程序中检测滚动到局部视图的底部

Asp.net mvc基础View的查找

如何在 ASP.NET MVC 5 中列出具有角色名称的用户

asp.net mvc 3 和动态视图生成

从 MVC 中控制器中的不同方法向视图发送消息