如何从asp.net mvc中的元组发布一个项目

Kar*_*eek 5 asp.net-mvc razor asp.net-mvc-4

我是asp.net mvc的新手.与此参考.我正在使用元组将两个模型发送到一个视图中.我正在创建两个表单和两个提交按钮; 但是服务器上的值会变为null

@model Tuple<DAL.Models.LoginModel, DAL.Models.ForgotPassword>

@{ ViewBag.Title = "Login"; }

@using (Html.BeginForm("Login", "User", FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>

        <ol>
            <li>
                @Html.LabelFor(m => m.Item1.EmailID)
                @Html.TextBoxFor(m => m.Item1.EmailID, new { @id = "txt_login_EmailID" })
                @Html.ValidationMessageFor(m => m.Item1.EmailID)
            </li>
            <li>
                @Html.LabelFor(m => m.Item1.Password)
                @Html.PasswordFor(m => m.Item1.Password)
                @Html.ValidationMessageFor(m => m.Item1.Password)
            </li>

            <li>
                <input type="submit" value="Login" id="btn_login" />

                @Html.CheckBoxFor(m => m.Item1.RememberMe)
                @Html.LabelFor(m => m.Item1.RememberMe, new { @class = "checkbox" })
            </li>
        </ol>

    </fieldset>
}
Run Code Online (Sandbox Code Playgroud)

这是同一页面中的另一种形式

  @using (Html.BeginForm("ForgotPassword", "user"))

   {

    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>

        <ol>
            <li>
                @Html.LabelFor(m => m.Item2.EmailId)
                @Html.TextBoxFor(m => m.Item2.EmailId, new { @id = "txt_fg_pwd_EmailID" })
                @Html.ValidationMessageFor(m => m.Item2.EmailId)

            </li>
            <li>

                <input type="submit" value="Reset Password" />
            </li>
        </ol>
    </fieldset>
}
Run Code Online (Sandbox Code Playgroud)

我的帖子方法是

    [HttpPost]
    public ActionResult Login(LoginModel LoginUser , string returnUrl)
    {   


        if (LoginUser.IsValid)
        {

            SetAuthenticationCookie(LoginUser, LoginUser.RememberMe);

            return RedirectToLocal(returnUrl);

        }
        else
        {
            ModelState.AddModelError("", "Incorrect user name or password .");
            return View(LoginUser);
        }


    }
Run Code Online (Sandbox Code Playgroud)

`

任何更改都需要查看或发布方法

Dar*_*rov 20

试试这样:

[HttpPost]
public ActionResult Login([Bind(Prefix = "Item1")] LoginModel loginUser, string returnUrl)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

由于您的值带有前缀,Item1您应该向模型绑定器指明.当然,您的ForgotPassword行动也是如此:

[HttpPost]
public ActionResult ForgotPassword([Bind(Prefix = "Item2")] ForgotPassword model)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 因为你的输入字段名为`name ="Item1.EmailID"`?注意`Item1`前缀?这是因为您使用的助手:`@ Html.TextBoxFor(m => m.Item1.EmailID,new {@id ="txt_login_EmailID"})`.但是你的`LoginModel`没有名为`Item1.EmailID`的属性.它有一个名为`EmailID`的属性.不幸的是,在POST请求有效负载中没有发送这样的值,并且默认模型绑定器无法知道(除非你告诉他)他应该将来自请求主体的`Item1.EmailID`值绑定到`EmailID`属性.你的模特.模型绑定器按惯例工作 (3认同)