如何在MVC3控制器检索HTTPPOST PARAMS?(How does the MVC3 Con

2019-09-18 10:36发布

我不太理解这是如何工作。

从我的实体对象传递的参数正常工作。 但是,当我创造新的领域,只有第一个被检索。

型号用户类别:

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和剃刀都在同一时间。 基本的C#是我来到这个知道的唯一部分。 :)

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

}


文章来源: How does the MVC3 Controller retrieve HTTPPOST params?