在 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> 标记内返回整个页面的主要内容,如果未能解决你的问题,请参考以下文章