2

我已经搜索并尝试了我的问题,但我找不到解决方案,我想知道是否有人可以帮助我修复我的代码..

我有一个编辑用户的视图..

 @model MembershipUser
 @{
ViewBag.Title = "Edit";
Layout = "~/Views/Shared/_Layout.cshtml";
 }

@using (Html.BeginForm()) {

@Html.ValidationSummary(true)
<fieldset>  
    <div class="editor-label">
      Username:
    </div>
    <div class="editor-field">
    @Html.DisplayFor(model => model.UserName)
    </div>

    <div class="editor-label">
       Email:
    </div>
    <div class="editor-field">
    @Html.EditorFor(model => model.Email)
    </div>

 <div class="editor-label">
       Password:
    </div>
    <div class="editor-field">
   @Html.DisplayFor(model => model.Password) 
    </div>
          <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>

然后在控制器中执行一个可以获取用户信息的操作..

    [Authorize(Roles = "Admins")]
    public ActionResult Edit(string username)
    {
        var usu = Membership.GetUser(username);
        return View(usu);
    }

另一个可以更新用户..

    [Authorize(Roles = "Admins")]
    [HttpPost]
    public ActionResult Edit(MembershipUser umtoupdate)
    {

MembershipUserCollection iduser = Membership.GetAllUsers();            

        if(umtoupdate.Password != umtoupdate.ConfirmPassword)
        {
                alert = "Password dont match!";
                return View("Users", "Admin");
        }

        else {

            foreach (MembershipUser um in iduser) {

                if (um.UserName == umtoupdate.UserName) {

                    Membership.DeleteUser(um.UserName, true);

                    // Attempt to register the new updated user
                    MembershipCreateStatus createStatus;
                    Membership.CreateUser(umtoupdate.UserName,
                    umtoupdate.Password,
                    umtoupdate.Email,
                    umtoupdate.PasswordQuestion,
                    umtoupdate.AnswerQuestion, true, null, out createStatus);

                }
            }
        }

               return View("Details", umtoupdate.UserName);

     }

在这个类中,我定义了一个构造函数,它创建一个列表来做另一件事(我放是因为它告诉我一些关于无参数构造函数的事情)..

    public AdminController()
    {

    foreach (MembershipUser member in iduser) {


            UserEntity entity2 = new UserEntity();
            entity2.Username = member.UserName;
            entity2.Roles = "Users";
            entity2.Email = member.Email;
            for (int i = 1; i < iduser.Count; i++)
            {
                entity2.ID_client = i;
            }
            _entities.Add(entity2);

       }

然后,我去编辑一个用户,我可以去第一个视图(可以在哪里编辑信息)但是当我尝试保存更新的信息并去第二个视图更新用户时,它告诉我

“[MissingMethodException 没有为此对象定义无参数构造函数。”

有人可以告诉我如何解决吗?如果我更改 Edit(string) 并删除 string 参数,但在这种情况下我无法获取 info 用户,并且如果我添加另一个没有参数的视图,它不会因为歧义而工作。

谢谢。


好的,谢谢,我不知道它没有公共构造函数!但是,如果我从 MembershipUser 做另一个继承类(例如,如你所说的 MyUser,使用公共构造函数)并且我做

public ActionResult Edit(MyUser umtoupdate) {...}

当我尝试获取用户信息时,告诉我我使用 MembershipUser 字典而不是 MyUser 字典,因为使用另一个视图

[Authorize(Roles = "Admins")]
public ActionResult Edit(string username)
{
    var usu = Membership.GetUser(username);
    return View(usu);
}

使用 membeship 类并返回一个会员用户,在这种情况下我不能使用 MyUser.GetUser,因为它是 Membership 的一种方法!

我能做些什么来解决它?

非常感谢。

4

3 回答 3

6

ModelBinder 尝试将您的表单绑定到 MembershipUser。不幸的是 MembershipUser 没有公共的默认构造函数。如果您想使用 ModelBinder,这是一个要求...

我建议创建一些其他类(例如 MyUser)并将此类用作您的 ViewModel。

于 2012-05-09T15:02:58.020 回答
2

MembershipUser 没有默认的公共无参数构造函数,因此您必须将对象包装在另一个类中,以使其作为模型可供您的视图访问。

public class MyUserModel
{
    public MembershipUser User { get; set; }
}

在您的控制器中:

MyUserModel model = new MyUserModel { User = Membership.GetUser() };
于 2012-05-10T06:41:57.387 回答
0

我通过在模型对象构造函数中设置值来完成此操作

模型示例:

public class ViewModel
{
    public MembershipUser User { get; set; }

    public ViewModel()
    {
        User = Membership.GetUser();
    }
}

POST 动作示例:

[HttpPost]
public ActionResult Account(ViewModel model)
{
    Membership.UpdateUser(model.User);
    return View(model);
}
于 2012-08-03T13:32:53.517 回答