我只是将我的ASP.NET MVC页面编译成HTML时,服务器上的表中没有数据。
我知道后端上的所有内容都可以使用,因为在其他视图上没有问题,但是由于某种原因,在此页面上它不起作用。
我怀疑这与模型中有两个类有关,因为这是唯一的页面,但是我不确定,因为我是MVC的新手。
这是模型,我将其称为 ModelFile.cs :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Project.Subgroup.Models
{
public class ClassIActuallyNeed
{
public int Id { get; set; }
public string Html { get; set; } //<---This is the data I want
public string Version { get; set; }
public bool Deleted { get; set; }
}
public class ClassMyFriendInsistsINeed
{
public int Id { get; set; }
public string Name { get; set; }
public byte[] Signature { get; set; }
public bool Deleted { get; set; }
public virtual ClassIActuallyNeed ClassIActuallyNeed { get; set; }
}
}
...以及称为 MainController.cs 的控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Project.Models;
using Project.Subgroup.Models;
using System.Data.Entity;
using Project.Models.Authentication;
namespace Project.Subgroup.Controllers
{
public class MainController : Controller
{
private MyDatabase context = new MyDatabase();
// GET: Lobby/Home
public ActionResult Index()
{
return View();
}
[HttpGet]
public ActionResult FormPage()
{
return View();
}
[HttpPost]
public ActionResult FormPage(ClassIActuallyNeed model)
{
if (ModelState.IsValid)
{
using (var context = new MyDatabase())
{
var modelfile = new ModelFile
{
Name = model.Name,
Signature = model.Signature,
ClassIActuallyNeedId = model.ClassIActuallyNeedId
};
}
}
return View(model);
}
}
}
...最后是视图,即 FormPage.cshtml :
@model Project.Models.ClassIActuallyNeed
@{
ViewBag.Title = "My Page";
Layout = "~/Subgroup/Views/Shared/_Layout.cshtml";
}
<h2 >@ViewBag.Title</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.DisplayFor(model => model.Html) //<---- the problem
//There is other form stuff in here
}
“ Html”数据实际上只是一个字符串,其中包含要放入网页的HTML。这是该表中的唯一一行,当我使用“ DisplayNameFor”而不是“ DisplayFor”时,它会在页面上成功放置名称“ Html”。
抱歉,我呕吐了,我删去了我所知道的与无关的所有内容,但是我无法真正确定问题所在。在Visual Studio或控制台中没有任何类型的错误。页面上的所有其他内容(包括我的JS东西)都可以正常工作。
编辑:感谢您到目前为止的所有输入。我知道问题不是我没有填充模型,因为它是由远程数据库填充的。这可以在其他页面上使用。 我怀疑RequestVerificationToken肯定应该存在,并且没有关系。
也要澄清:问题不是它显示的是未格式化的文本而不是HTML。问题在于它什么也没显示。
答案 0 :(得分:3)
您目前可以看到2个问题:
您没有用任何数据填充模型
//Allows for image to be moved
Timer time = new Timer(5, this);
//Initial position for the image
int x = 0, y = 0;
//Initial velocity for the image
int velX = 0, velY = 0;
private ImageIcon image;
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
ImageIcon i = new
ImageIcon("C:\\Users\\nolan\\Pictures\\boomer.jpg");
i.paintIcon(this, g, x, y);
time.start();
}
//Constructor that allows for key sensitivity
public FinalProject2() {
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
image = new ImageIcon("boomer.jpg");
}
//Specific commands for when a certain key is pressed
public void keyPressed(KeyEvent e) {
int k = e.getKeyCode();
//Moves object left by pressing A key
if (k == KeyEvent.VK_A) {
velX = -1;
velY = 0;
}
//Moves object right pressing D key
if (k == KeyEvent.VK_D) {
velX = 1;
velY = 0;
}
//Moves object up pressing W key
if (k == KeyEvent.VK_W) {
velX = 0;
velY = 1;
}
//Moves object down pressing S key
if (k == KeyEvent.VK_S) {
velX = 0;
velY = -1;
}
}
您没有将html字符串呈现为html
[HttpGet]
public ActionResult FormPage()
{
//you need to pass the view some data, otherwise your model in your view
//will be null and you wont get any output (which is what you're seeing now)
ClassIActuallyNeed model = null;
//hardcoded:
//model = new ClassIActuallyNeed
//{
// Id = 1,
// Html = "<h1>Hello</h1>",
// Version = "something,
// Deleted = false
//};
//an example of using your context to fetch your model
using(var context = new MyDatabase())
{
var id = 1
model = context.ClassIActuallyNeeds.Single(x => x.Id == id);
}
return View(model);
}
将在页面上将此属性呈现为纯文本格式,因此您不会看到Html.DisplayFor(model => model.Html)
为纯文本格式,而不会看到Hello
标签中的格式<h1>
在页面上。框架这样做是为了防止注入攻击,我建议您仔细阅读一下,但是就本文而言,这超出了范围。要实际渲染html字符串,请使用<h1>Hello</h1>
作为补充说明,
Html.Raw(model => model.Html)
您看到的是您使用<input name="__RequestVerificationToken" type="hidden" value="[a bunch of junk characters here]">
的结果。反伪造令牌用于防御CSRF攻击,我也建议您继续阅读(安全性很重要!)。由于此视图中没有任何可编辑的数据(这是我根据您使用@Html.AntiForgeryToken()
所做的假设),因此没有理由我认为您的视图中没有表单(DisplayFor
)或一个AntiForgeryToken。如果这些数据是可编辑的,并且可以发布回服务器,那么请不要理会这两个数据,而这两个数据可能都需要保留在原处。
通过上面的controller动作,您的视图可能看起来像下面这样来显示您的数据:
Html.BeginForm
如果此数据需要可编辑,则看起来更像
@model Project.Models.ClassIActuallyNeed
@{
ViewBag.Title = "My Page";
Layout = "~/Subgroup/Views/Shared/_Layout.cshtml";
}
<h2 >@ViewBag.Title</h2>
@Html.Raw(model => model.Html)