ASP.NET MVC 5在回发时修剪字符串?

时间:2014-08-12 09:19:22

标签: c# asp.net-mvc

在回发期间(假设验证错误)我的文本输入字段不显示修剪值,即使我在我的模型中指定它们(参见下面的简单模型)。这些值确实在我的控制器下修剪,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 !
    }
}

3 个答案:

答案 0 :(得分:0)

试试这个:

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中的每个Trim上应用string model property,请点击以下链接:

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

OR

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

答案 1 :(得分:0)

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

  

"数据来自 POST - >的MVC。 GET - >模型(按此顺序),   对于你的问题,[使用] ModelState.Remove(" Name")[in   控制器]"

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 :(得分:0)

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

例如,您可以拥有一个FormName属性(这是在表单中输入的值)和一个Name属性(这是经过修剪/验证的属性),每当{{1} },并用于呈现视图和应用程序逻辑。