MVC3 Controller如何检索HTTPPOST参数?

时间:2012-06-23 04:14:49

标签: c# asp.net asp.net-mvc asp.net-mvc-3 razor

我不太了解这是如何运作的。

从我的实体对象传递参数可以正常工作。但是当我创建新字段时,只检索第一个字段。

模型用户类:

public class User {

    [Key]
    public long Uid { get; set; }

    [Required]
    [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 4)]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email:")]
    public string Email { get; set; }

    [Required]
    [StringLength(20, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 4)]
    [Display(Name = "User Name:")]
    public string Username { get; set; }

    public string Password { get; set; }

    public byte Role { get; set; }

    public DateTime Created { get; set; }
}

CSHTML:

@using (Html.BeginForm( null,
                    null,
                    FormMethod.Post,
                    new { id = "regform" })
    ) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Register</legend>

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

    <div class="editor-label">
        @Html.LabelFor(model => model.Username)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Username)
        @Html.ValidationMessageFor(model => model.Username)
    </div>

    <div class="editor-label">
        Password:
    </div>
    <div class="editor-field">
        @Html.Password("pwd")
    </div>

    <div class="editor-label">
        Confirm Password:
    </div>
    <div class="editor-field">
        @Html.Password("confirm")
    </div>

    <p>
        <input type="submit" value="Register" />
    </p>
</fieldset>
}

控制器:

    [HttpPost]
    public ActionResult Register(User user, string pwd, string confirm) {
        user.Username = confirm;
        user.Created = DateTime.Now;
        user.Role = 255;
        user.Password = EncryptPassword.Password(pwd);


        if (ModelState.IsValid && pwd == confirm) {
            db.Users.Add(user);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(user);
    }

我感到困惑的是pwd好转。另一方面,confirm仍为null。我最初认为它是按订单调用的,confirm在模型中只是conPwd。如果不起作用,我将其名称更改为confirm。它仍然无法正常工作,我找不到任何解释如何将多个参数传递给控制器​​的内容。

编辑: 更新了我的代码。信不信由你,这一天我大部分时间都在写作,因为我一直试图理解我在做什么。当你同时学习实体,LINQ,MVC,ASP.NET和Razor时,还有很多东西需要考虑。基本的C#是我知道的唯一部分。 :)

1 个答案:

答案 0 :(得分:1)

您需要RegisterModel的强类型视图,然后使用Html.BeginForm将数据发布到控制器。

<强>模型

// This is the Model that you will use to register users
public class RegisterModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email address")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

查看(CSHTML)

// This is your strongly typed view that will use
// model binding to bind the properties of RegisterModel
// to the View.
@model Trainer.Models.RegisterModel

// You can find these scripts in default projects in Visual Studio, if you are
// not using VS, then you can still find them online
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

// This is where your form starts
// The "Account" parameter states what controller to post the form to
@using (Html.BeginForm((string)ViewBag.FormAction, "Account")) {
    @Html.ValidationSummary(true, "Account creation was unsuccessful. Please correct the errors and try again.")

    <fieldset>
        <legend>Registration Form</legend>
        <ol>
            <li>
                @Html.LabelFor(m => m.UserName)
                @Html.TextBoxFor(m => m.UserName)
                @Html.ValidationMessageFor(m => m.UserName)
            </li>
            <li>
                @Html.LabelFor(m => m.Email)
                @Html.TextBoxFor(m => m.Email)
                @Html.ValidationMessageFor(m => m.Email)
            </li>
            <li>
                @Html.LabelFor(m => m.Password)
                @Html.PasswordFor(m => m.Password)
                @Html.ValidationMessageFor(m => m.Password)
            </li>
            <li>
                @Html.LabelFor(m => m.ConfirmPassword)
                @Html.PasswordFor(m => m.ConfirmPassword)
                @Html.ValidationMessageFor(m => m.ConfirmPassword)
            </li>
        </ol>
        <!-- The value property being set to register tells the form
             what method of the controller to post to -->
        <input type="submit" value="Register" /> 
    </fieldset>
}

<强>控制器

// The AccountController has methods that only authorized
// users should be able to access. However, we can override
// this with another attribute for methods that anyone
// can access
[Authorize]
public class AccountController : Controller
{

    // This will allow the View to be rendered
    [AllowAnonymous]
    public ActionResult Register()
    {
        return ContextDependentView();
    }

        // This is one of the methods that anyone can access
        // Your Html.BeginForm will post to this method and
        // process what you posted.
        [AllowAnonymous]
        [HttpPost]
        public ActionResult Register(RegisterModel model)
        {
            // If all of the information in the model is valid
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                MembershipCreateStatus createStatus;
                Membership.CreateUser(model.UserName, model.Password, model.Email, passwordQuestion: null, passwordAnswer: null, isApproved: true, providerUserKey: null, status: out createStatus);

                // If the out parameter createStatus gives us a successful code
                // Log the user in
                if (createStatus == MembershipCreateStatus.Success)
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, createPersistentCookie: false);
                    return RedirectToAction("Index", "Home");
                }
                else // If the out parameter fails
                {
                    ModelState.AddModelError("", ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

}