表中的数据未出现在ASP.NET页上

时间:2019-05-24 18:20:30

标签: c# html asp.net asp.net-mvc

我只是将我的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。问题在于它什么也没显示。

1 个答案:

答案 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)