将大型HTML字符串从View传递给Controller

注意:我现在是戴着.Net开发人员的前端开发人员。 可笑,我知道,但是我最终陷入这个混乱局面并不是这个问题的重点。 有了免责声明,这就是正在发生的事情。

正如标题所示,我需要将一个非常长的HTML字符串(如多页文本中)从View传递给Controller。 我花了最后几天研究各种方法来实现这一目标。 TBH,有些事情是有道理的,有些则没有。

这是我在View中的代码片段:

var html = "
" + "" + "
"; // string literal html gets appended to some element... $("#htmlContent").submit();

我想在此指出一些事项:

  • 我在这里使用字符串文字来构造表单,因为这个DOM需要在某个时刻动态地附加到其他元素。
  • 我是否使用有效的HTML字符串是不可能的。 我已经分别测试了它的有效性,一切看起来都很好。
  • 我故意使用jQuery的submit()方法而不是使用Ajax调用。

控制器:

 [HttpPost] public ActionResult ParseHtml(FormCollection form) { string htmlStr = form["content"].ToString(); .... // some code in between, but the first line appears to be causing an error or // the value is not being retrieved. .... return new EmptyResult(); } 

我理解我在MVC框架的上下文中工作,我理解它的概念。 但是,知道如何用我非常有限的知识来实现​​它是另一回事(特别是当你从一个早已离开你的项目的人那里inheritance了一个糟糕的代码库时!)

我想这很简单易行,但我的轮子旋转时间比我想要的长得多。 任何指向正确方向的指针都将非常受欢迎。

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

Index.cshtml

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

title

Controller.cs

 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"); } } } 

如果在return View("Index");上放置断点return View("Index"); ,你会看到htmlStr是“oranges”,这是附加文本框的值。

不回答问题的主要部分,因为我不确定所有细节,抱歉。 我并不是说你在任何方面都做错了“因为我不确定外围可能会让它看起来像是必要的,但是你可能会创造一种你将会头疼的局面在后端解析和什么不解析。 由于我不确定要求,所以很多机会很多都是错的,所以我道歉。

 "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中使用相同的数据。 如果你正在尝试动态创建元素,我想你正在使用某种类型的模式(即我正在研究一个项目,我在那里迭代一个集合并做

  

然后迭代FormCollections AllKeys元素来获取它们(解析出attribute_以及你喜欢什么:

 foreach(var key in form.AllKeys) { var id = Convert.ToInt32(key.Replace("attribute_", "")); // may want to TryParse var item = Item.GetItemById(id); item.Value = form[key]; item.Update(); } 

在视图的某个地方,你使用javascript设置document.getElementById(“contentStr”)(不确定是否有意,但你的id和名称是不同的。本身并不是坏事,但可能导致oops)? 然后再次,不确定var html =在这里使用了什么。 Razor认为你可以做[form] … [/ form]的常规html。 你是否在提交行动之前做了类似的事情?

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