我有一个非常不寻常的问题,即使调试器声称在控制器中使用新创建的新模型渲染局部视图,它也会使用从帖子传入的数据中的模型值进行渲染。
modelstate.clear();解决了这个问题但肯定这是不正确的。
有什么想法吗?
调用脚本
$("#registerSubmit").live("click", function (e) {
if ($("#registerForm").valid()) {
$.ajax({
url: 'home/Register',
data: $("#registerForm").serialize(),
type: 'POST',
success: function (data) {
alert(data);
$("#registerHolder").html(data);
}
});
}
e.preventDefault();
});
控制器
[HttpPost]
public ActionResult Register(Register model)
{
var t = new Register();
t.EmailAddress = "test";
t.Password = "1";
t.VerifyPassword = "2";
return PartialView("p_register2", t);
}
答案 0 :(得分:2)
如果要修改正在POST的值,则需要将其从模型状态中删除,否则HTML帮助程序将始终使用POSTed值而不是模型中的值。这就是HTML帮助程序的工作方式,这种行为是设计的。例如,Html.TextBoxFor(x => x.EmailAddress)
助手看到有一个POST EmailAddress
值,它将使用此值而不是您在模型中传递的值。
因此,您应该从模型状态中删除要修改的值,或者编写自己的HTML帮助程序:
[HttpPost]
public ActionResult Register(Register model)
{
var t = new Register();
t.EmailAddress = "test";
t.Password = "1";
t.VerifyPassword = "2";
ModelState.Remove("EmailAddress");
ModelState.Remove("Password");
ModelState.Remove("VerifyPassword ");
return PartialView("p_register2", t);
}
看着这个动作,人们可能会问自己一个问题:你用作动作参数的Register模型的目的是什么?所以:
[HttpPost]
public ActionResult Register()
{
var t = new Register();
t.EmailAddress = "test";
t.Password = "1";
t.VerifyPassword = "2";
return PartialView("p_register2", t);
}