C# 将大型HTML字符串从视图传递到控制器

C# 将大型HTML字符串从视图传递到控制器,c#,forms,model-view-controller,C#,Forms,Model View Controller,注意:我现在是一个戴着.Net开发者帽子的前端开发者。我知道这很可笑,但我怎么会陷入这样的困境并不是这个问题的重点。有了这个免责声明,下面是正在发生的事情 正如标题所示,我需要将一个相当长的HTML字符串(如多页文本)从视图传递给控制器。我花了几天时间研究各种方法来实现这一目标。TBH,有些事情是有意义的,而有些事情是没有意义的 这是我在视图中的代码: var html = "<form id='htmlContent' action='" + customUrl + "' met

注意:我现在是一个戴着.Net开发者帽子的前端开发者。我知道这很可笑,但我怎么会陷入这样的困境并不是这个问题的重点。有了这个免责声明,下面是正在发生的事情

正如标题所示,我需要将一个相当长的HTML字符串(如多页文本)从视图传递给控制器。我花了几天时间研究各种方法来实现这一目标。TBH,有些事情是有意义的,而有些事情是没有意义的

这是我在视图中的代码:

var html =
    "<form id='htmlContent' action='" + customUrl + "' method='post'>" +
        "<input type='hidden' name='content' id='contentStr'>" +
    "</form>";

// string literal html gets appended to some element...

$("#htmlContent").submit();
我知道我是在MVC框架的背景下工作的,我有点理解它的概念。但是,知道如何用我非常有限的知识实现它是另一回事(特别是当你从一个早已离开你的项目的人那里继承了一个糟糕的代码库时!)


我想这是非常简单和简单的,但我已经旋转我的轮子比我想的要长得多。任何指向正确方向的指针都将不胜感激。

由于我不确定所有细节,因此没有回答您问题的主要部分,对不起。我并不是说你在做任何“错误”的事情,因为我不确定外围设备可能会使它看起来像是必要的,但你可能会造成一种情况,在后端解析上你会有一个很大的头痛,什么都没有。很有可能这些都是错误的,因为我不确定这些要求,所以我道歉

"I'm using a string literal to construct the form here because this 
 DOM needs to be dynamically attached to other element at some point."
您想在另一个组件中重新渲染同一元素吗?听起来你在寻找局部视图。这样,可以在View1中渲染它,并在View2中使用相同的数据。如果您正在尝试动态创建元素,我可以想象您正在使用某种类型的模式(例如,我正在处理一个项目,其中我迭代了一个集合并执行

<input type='text' id='attribute_@(item.Id)' name='attribute_@(item.Id)' />
在视图中的某个地方,您正在使用javascript设置document.getElementById(“contentStr”)(不确定是否有意,但您的id和名称不同。这本身不是一件坏事,但可能会导致oops)?然后,同样不确定这里使用了什么var html=。Razor视图您可以只执行[form]…[/form]的常规html.在提交操作之前,您是否正在执行类似操作

$('#content').val(html);

在这个最小的可重复答案中,我将向您展示如何使其工作,您可以从这里使用它:

Index.cshtml

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        var url = '@Url.Action("Create","Stack")';
        var html = $("<form id='htmlContent' action='"+url+"' method='post'><input type='hidden' name='content' id='contentStr' value='oranges'/></form>");
        $(body).append(html);

        $("#htmlContent").submit();
    });
</script>

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

<h2>title</h2>

如果您在
返回视图(“索引”);
上放置一个断点,您将看到htmlStr是“橙子”,这是附加文本框的值。

“一切看起来都很好”是一些非常好的最后一句话!在这种情况下,您的模型是什么?@CBauer-更不用说,“但它在我的机器上工作!”顺便说一句,我没有为此特定代码创建的任何模型。对于输入类型,您有值吗?我不确定如果输入没有值,该模型将如何工作。它是否必须附加到DOM中,或者它是否可以隐藏在那里并在程序执行期间可见?@SurgeonofDeath-不确定我是否理解您的意思y、 但我确实有一个值(html字符串)正确地分配给输入字段。Robert-回答一些问题:变量html被附加到现有元素,该元素由我们正在使用的CMS应用程序动态生成。这就是为什么我必须在呈现所有DOM后将其附加到其他元素。至于实际的html字符串,它由$(“#contentStr”).val(htmlStr);
$('#content').val(html);
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        var url = '@Url.Action("Create","Stack")';
        var html = $("<form id='htmlContent' action='"+url+"' method='post'><input type='hidden' name='content' id='contentStr' value='oranges'/></form>");
        $(body).append(html);

        $("#htmlContent").submit();
    });
</script>

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

<h2>title</h2>
using System.Web.Mvc;

namespace MvcPlayground.Controllers
{
    public class StackController : Controller
    {
        //
        // GET: /Stack/

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Create(FormCollection form)
        {
            string htmlStr = form["content"].ToString();

            return View("Index");
        }
    }
}