【问题标题】:Truncated strings with TextBoxFor使用 TextBoxFor 截断字符串
【发布时间】:2013-11-26 09:04:32
【问题描述】:

在我们的 ASP.Net MVC 3 应用程序中,当字符串值包含双引号时,我们会在表单上截断字符串。

例如,给定一个文本框:

@Html.TextBoxFor(m => m.County)

如果用户输入字符串:'Hampshire"County',则在将值渲染回表单时,仅显示字符串'Hampsire'。如果我检查模型中的值,则双引号被转义作为“汉普郡”。在 Fiddler 中,发布的值是正确的,并且该值正确存储在数据库中,因此它似乎与将文本框呈现给客户端的 Html 帮助器有关。

有人能解释一下吗?

【问题讨论】:

  • 为什么在你的数据中间还有"?该输入应该被验证,并且可能被删除?否则你最终会遇到像你现在遇到的那样的 PITA 场景:)
  • 视图呈现的最终 HTML 看起来是否正确(除了文本框中的值错误)?可以发一下吗?
  • 你确定这是一个双引号而不是两个并排的撇号吗?
  • @AndreiV 如何将两个并排的撇号转义为 '\"'?
  • 感谢大家的回复,不幸的是 Jason,是的,尽管他们是 PITA,但我们需要允许双引号。业务需求等等。事实证明,这是我们正在做的事情导致了这个问题,我将在回答我自己的问题时进行解释..

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


【解决方案1】:

我无法重现此问题。刚刚创建了一个新的 MVC 3 项目,创建了一个具有 2 个操作(GET 和 POST)的控制器,具有类型化视图,接收具有字符串属性 Text 的对象,并将其显示在表单中......这一切都按预期进行.没有问题。我输入的所有内容都已发布,并在 POST 中正确返回。

查看

@model MvcApplication1.Models.MyClass
@{
    ViewBag.Title = "Home";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Home</h2>
@using (Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Text)
}

控制器

public class HomeController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(MyClass data)
    {
        return View(data);
    }
}

型号

public class MyClass
{
    public string Text { get; set; }
}

所以,问题一定出在其他地方......可能会与正在呈现的值混淆(编辑器模板,javascript)

尝试查看渲染页面的来源,看看那里的值是否正确,如果正确,则必须是javascript,否则,它必须是服务器中的东西。

【讨论】:

  • 感谢您花时间调查这个 Miguel,原来这是我们自己造成的问题,我会回答我自己的问题来解释我们做错了什么。
【解决方案2】:

事实证明,这是我们自己造成的问题。事实证明,大约 9 个月前,一些明亮的火花(我)认为在自定义 HttpEncoder 中覆盖 HtmlAttributeEncode() 方法是个好主意。这会在输出渲染期间触发。

我添加这个的原因是应用程序的某些部分需要向客户端呈现脚本块,并且默认编码器与 HTML 中的 JS 代码搞砸了。

当我们删除覆盖方法时,问题就消失了。经验教训:除非绝对需要,否则不要乱搞框架。

再次感谢大家花时间考虑这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多