【问题标题】:ASP.NET MVC 5 Trim string on postback?ASP.NET MVC 5 在回发时修剪字符串?
【发布时间】:2014-10-05 07:15:20
【问题描述】:

在回发期间(假设验证错误)我的文本输入字段不显示修剪值,即使我在我的模型中指定它们是这样的(参见下面的简单模型)。这些值确实在我的控制器下被修剪,debug.writeline() 显示它们,但这并没有反映在视图中。

在回发后,如何让修剪反映在我的视图中(在输入字段中)?

简单模型:

private string _name;

public string Name {
    get { return this._name; }
    set { this._name = (value == null) ? "" : value.Trim(); }
}

简单的控制器:

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

[HttpPost]
public ActionResult Index([Bind(Include="Name,City,State")] Model model) {

    Debug.WriteLine("Name: " + model.Name);  // trimmed!

    return View(model);
}

简单视图:

@using(Html.BeginForm()) {
    @Html.EditorFor(m => m.Name);   // not trimmed!
    @Html.ValidationMessageFor(m => m.Name);
}

更新: 在我的简单控制器 HttpPost 方法中,我将模型传递给视图“返回视图(模型)”。在我看来,我可以简单地通过执行“Model.Name”或“@Model.Name”来引用该对象,当我这样做时,我看到它被修剪了。然而问题仍然存在,因为我不明白如何在@Html.LabelFor、@Html.EditorFor 助手下引用传入的对象(模型)?我确实尝试以一些创造性的方式使用@Html.Label 和@Html.Editor,但这也不起作用。如果我理解辅助对象,那么 @Html.EditorFor(m => m.Name) 实际上并没有引用传入的对象(模型),而是创建了对它的新引用。

在视图中:

@{
    Layout = null;

    if (Model != null) {
        Debug.WriteLine("From View: _" + Model.Name + "_");  // trimmed !
    }
}

【问题讨论】:

  • 你应该把Trim()放在一个getter中?
  • 你能显示Get & Post 控制器方法吗?
  • 已编辑,添加了简单控制器。
  • 试试下面的答案
  • 试试这行Debug.WriteLine("Name:_" + model.Name + "_"); 确保没有空格。

标签: c# asp.net-mvc


【解决方案1】:

在 ASP.NET 上发布了相同的问题,并收到了来自 @ignatandrei 的回复(标记为答案)。简而言之,问题与@Html.Helpers 如何处理传入数据有关。 @ignatandrei 解释说:

"数据从 POST --> GET --> MODEL (按此顺序) 进入 MVC, 对于您的问题,[使用] ModelState.Remove("Name") [在 控制器]。”

http://forums.asp.net/p/2002010/5754373.aspx?ASP+NET+MVC+5+Trim+string+on+postback+

通过进一步研究,我发现以下文章很好地解释了 ModelState(以及其他)、Html.Helpers 和 Views(以及它们的关系)。

http://www.gxclarke.org/2010/05/consumption-of-data-in-mvc2-views.html?m=1

更新: 这是一篇完美解释问题(和可能的解决方案)的文章: http://weblog.west-wind.com/posts/2012/Apr/20/ASPNET-MVC-Postbacks-and-HtmlHelper-Controls-ignoring-Model-Changes

【讨论】:

    【解决方案2】:

    试试这个:

    private string _name;
    
    public string Name {
    get { return ((this._name != "" && this._name != null ) ? this._name.Trim():this._name); }
    set { this._name = (value == null) ? "" : value.Trim(); }
    }
    

    为了在 asp.net mvc 中的每个 string model property 上应用 Trim,请点击以下链接:

    http://puredotnetcoder.blogspot.in/2011/12/automatically-trim-html-controls-in.html

    ASP.NET MVC: Best way to trim strings after data entry. Should I create a custom model binder?

    【讨论】:

    • 我会试一试,但在帖子上不是设置值吗?之后 GET 应该返回修剪后的值?
    • 是的......但我认为上面的答案会解决问题,试一试......@JasonCaldwell....
    • @JasonCaldwell...读这个...puredotnetcoder.blogspot.in/2011/12/…
    • 看起来很有希望。
    • @JasonCaldwell...它正在工作我已经使用它..只需检查其他地方肯定有问题..或访问stackoverflow.com/questions/1718501/…
    【解决方案3】:

    如果您不想弄乱模型状态(请参阅https://stackoverflow.com/a/25282083/2279059)或依赖 .NET/Razor 的实现细节(在这种情况下非常好),您也可以通过创建单独的属性。

    例如,您可以有一个 FormName 属性,它是输入到表单中的值,还有一个 Name 属性,它是经过修剪/验证的属性,每当设置 FormName 时都会设置它,并且您用于呈现视图以及应用程序逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多