Данные из таблицы не отображаются на странице ASP.NET - PullRequest
2 голосов
/ 24 мая 2019

Очень просто у меня есть данные в таблице на сервере, которые не отображаются, когда моя страница 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 Ответ

3 голосов
/ 24 мая 2019

В настоящее время у меня есть 2 проблемы, которые я вижу:

  • Вы не заполняете свою модель какими-либо данными

    [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, так как html

    Html.DisplayFor(model => model.Html) отобразит это свойство в виде обычного текста на странице, поэтому вместо просмотра Hello в формате <h1> вы увидите <h1>Hello</h1> в виде простого текста на странице.Фреймворк делает это для защиты от инъекционных атак, о которых я бы посоветовал вам прочитать немного, однако это выходит за рамки настоящего поста.Чтобы визуализировать HTML-строку, используйте Html.Raw(model => model.Html)

. В качестве дополнительной примечания, <input name="__RequestVerificationToken" type="hidden" value="[a bunch of junk characters here]">, который вы видите, является результатом использования @Html.AntiForgeryToken().Маркер защиты от подделки используется для защиты от CSRF-атак, о которых я бы посоветовал вам прочитать (безопасность важна!).Поскольку в этом представлении нет редактируемых данных (это предположение, которое я делаю на основе того, что вы используете DisplayFor), я не вижу причин, чтобы в вашем представлении была форма (Html.BeginForm) или AntiForgeryToken.Если эти данные доступны для редактирования и могут быть отправлены обратно на сервер, не обращайте на них внимания, и оба этих двух компонента, вероятно, должны остаться на месте.

При описанном выше действии контроллера ваше представление может выглядеть следующим образомдля отображения ваших данных:

@model Project.Models.ClassIActuallyNeed

@{
    ViewBag.Title = "My Page";
    Layout = "~/Subgroup/Views/Shared/_Layout.cshtml";
}

<h2 >@ViewBag.Title</h2>

@Html.Raw(model => model.Html) 

Если эти данные нужно редактировать, то они будут выглядеть как

@model Project.Models.ClassIActuallyNeed

@{
    ViewBag.Title = "My Page";
    Layout = "~/Subgroup/Views/Shared/_Layout.cshtml";
}

<h2 >@ViewBag.Title</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.HiddenFor(model => model.Id)
    @Html.HiddenFor(model => model.Version)
    @Html.HiddenFor(model => model.Deleted)
    @Html.EditorFor(model => model.Html)

    <input type="submit" value="Submit">
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...