2013-12-11 109 views
1

我有一个MVC视图以下文本框:设置Html.TextBox值设置为null

@Html.TextBoxFor(x => x.Captcha, new { @value = "" }) 

我想文本框永远是空当的形式显示有错误被submited之后......但是,这不管用。我总是看到最后的价值。

这是我的控制器:

[Route("signup"), HttpGet] 
public virtual ActionResult SignUp() { 

    UserSignUpModel model = new UserSignUpModel(); 
    model.Captcha = String.Empty; 
    model.Email = ""; 
    return View(model); 

} // SignUp 

[Route("signup"), HttpPost, ValidateAntiForgeryToken] 
public virtual ActionResult SignUp(UserSignUpModel model) { 

    if (ModelState.IsValid) { 

    // Create account code 
    return View(MVC.Shared.Views._Note, new NoteModel("Account created")); 

    } else { 

    model.Captcha = String.Empty; 
    model.Email = ""; 

    return View(Views.SignUp, model); 

    } 

} 

谢谢你, 米格尔

+0

你能粘贴你的UserSignUpModel吗? – solidau

回答

0

在你的控制器动作方法设置这个参数手动:

// ... 
model.Captcha = String.Empty; 
return View(model); 

,我建议增加autocomplete =关闭HTML属性到您的验证码字段:

@Html.TextBoxFor(x => x.Captcha, new { autocomplete = "off" }) 
+0

我加了你的两个建议,而不是运气......当我使用model.Captcha = String.Empty;它仍然显示...任何想法? –

+0

我刚刚用控制器代码更新了我的帖子......我也尝试将电子邮件设置为“”并具有相同的结果。 –

+0

With HttpContext.Request.Params [“Captcha”] =“”我得到:在System.dll中发生类型'System.NotSupportedException'的异常,但未在用户代码中处理 其他信息:集合是只读的。 –

1

如果您的表单提交时有错误,您可以在返回错误视图之前清除ViewData并显式清除控制器中的属性。

[HttpPost] 
public ActionResult MyController(Model myModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     myModel.Captcha = String.Empty; 

     ViewData = null; 

     return View(myModel); 
    } 

    return View(myModel); 
} 
+0

是的!这是因为ViewData! Asp.Net隐藏了很多开发者的东西,所以有时候这很容易混淆 –

+0

不能做你的建议......当我使用ViewData = null时,我能够使Captcha =“”但我在ViewBag上的数据被删除了。还有其他选择吗? –

1

我能解决这个问题。正确的方法是使用模型状态:

ModelState [“Captcha”]。Value = new ValueProviderResult(“”,“”,Thread.CurrentThread.CurrentCulture);

这样就不需要清除ViewData中的其他数据。

通过更改ModelState,而不是将其删除,仍然可以显示与该属性相关的错误。