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

时间:2014-12-17 21:28:28

标签: c# forms model-view-controller

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

正如标题所示,我需要将一个很长的HTML字符串(如多页文本中)从View传递给Controller。我花了最后几天研究各种方法来实现这一目标。 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();

我想在此指出一些事项:

  • 我在这里使用字符串文字来构造表单,因为这个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框架的上下文中工作,我理解它的概念。但是,知道如何用我非常有限的知识来实现​​它是另一回事(特别是当你从一个早已离开你的项目的人那里继承了一个糟糕的代码库时!)

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

2 个答案:

答案 0 :(得分:1)

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

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>

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");上放置一个断点,你会看到htmlStr是“oranges”,这是附加文本框的值。

答案 1 :(得分:0)

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

"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)' />

然后遍历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);