通过Ajax(jquery)渲染RenderPartial并使用不正确的模型渲染。 (BUG)?

时间:2011-06-08 14:50:41

标签: jquery asp.net-mvc-3

我有一个非常不寻常的问题,即使调试器声称在控制器中使用新创建的新模型渲染局部视图,它也会使用从帖子传入的数据中的模型值进行渲染。

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);
        } 

1 个答案:

答案 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);
}