0

通常当我设计一个表单时,我期望的数据是页面视图模型的一部分,我可以将类放在控制器方法中并且绑定工作。

但是,我在母版页的部分视图中添加了一个表单,因此它并不特定于任何一个视图模型。我尝试确保表单字段的 ID 与通常自动生成的 ID 匹配,但在我的控制器方法中对象值始终为空。

这是我的母版页的部分视图的片段:

            <tr>
                <td >Current password:</td>
                <td><%= Html.Password("PasswordChange.OriginalPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td>
            </tr>            
            <tr>
                <td >New password:</td>
                <td><%= Html.Password("PasswordChange.NewPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td>
            </tr>

如您所见,可以想象,PasswordChange 不是我所有视图模型的一部分(肯定没有必要从一个公共基础继承我的所有视图模型才能使用此表单?)。

我的控制器方法如下所示:

[HttpPost]
        public ActionResult ChangePassword(PasswordChange PasswordChange)
        {

我点击了该方法,但 PasswordChange.OriginalPassword 和 PasswordChange.NewPassword 始终为空。

我认为有一些简单的方法可以做到这一点,但我无法弄清楚。

4

2 回答 2

2

去掉前缀:

<tr>
    <td>Current password:</td>
    <td><%= Html.Password("OriginalPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td>
</tr>            
<tr>
    <td >New password:</td>
    <td><%= Html.Password("NewPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td>
</tr>

或者如果你想保留一个前缀,请确保你定义了这个前缀:

[HttpPost]
public ActionResult ChangePassword(
    [Bind(Prefix = "PasswordChange")] PasswordChange model
)
{
    ...
}

顺便说一句,您也可以考虑使用子操作:

public class PasswordChangeController: Controller
{
    [ChildActionOnly]
    public ActionResult Index()
    {
        var model = new PasswordChange();
        return PartialView(model);
    }
}

然后在您的母版页中,而不是呈现部分,呈现子操作:

<% Html.RenderAction("Index", "PasswordChange"); %>

当然,现在您将拥有一个强类型~/Views/PasswordChange/Index.ascx部分,您可以在其中生成表单并使用强类型版本的助手。

有关子操作的更多信息,您可以查看 Phil Haackblog post关于此主题的文章。

于 2013-02-18T17:02:59.883 回答
0

我的 PasswordChange 类的成员没有设置为公开的。

@%$#$^#%&%

public class PasswordChange
    {
        public OriginalPassword { get; set; }
        public NewPassword { get; set; }
    }

public class PasswordChange
    {
        public string OriginalPassword { get; set; }
        public string NewPassword { get; set; }
    }
于 2013-02-18T17:04:41.777 回答