为什么模型发布到行动显示在视图中?

时间:2014-04-22 11:58:06

标签: asp.net-mvc asp.net-mvc-4

有两个同名的动作。(AddNewUser)其中一个使用HttpGet,另一个使用HttpPost。

[HTTPGet]
 public ActionResult AddNewUser()
    {
        User user = Utilities.SessionProvider.GetCurrentUser();
        if (user.ID_User == 0)
            return Redirect("Apps.kosarfci.ir");

        RoleType role = (RoleType)RoleDeterminer.RoleDeterminate();

        if (role != RoleType.Center)
        {
            return RedirectToAction("Restriction");
        }

        return View("VNewUser");
    }




 [HttpPost]
    public ActionResult AddNewUser(VMNewUser InModel)
    {
        User user = Utilities.SessionProvider.GetCurrentUser();
        if (user.ID_User == 0)
            return Redirect("Apps.kosarfci.ir");

        RoleType role = (RoleType)RoleDeterminer.RoleDeterminate();

        if (role != RoleType.Center)
        {
            return RedirectToAction("Restriction");
        }
        IUserBL centerUserBL = new CenterUserBL();

        InModel.User.UserName = InModell.User.NationalCode;
        InModel.User.Password = InModell.User.PersonalCode;
        bool confirmedBL = centerUserBL.AddUser(InModel.User);

       _msgList.Add(new Message() { MsgType = MessageType.Success, MsgContent =         MessageProvider.GetMessage(MessageContent.Submit_Success_NewUser) });
        ViewBag.Message = _msgList;

        return View("VNewUser");

    }

AddNewUser(),返回带有输入条目的表单,然后将表单提交给AddNewUser(VMNewUser InModel)。但之后会显示带有已填充条目和已过帐模型的表单。我希望显示空白输入条目的表单,因为我不会将预填充模型(VMNewUser)发送到视图中。 为什么?

- VMNewUser -

@model PersonManagement.Views.User.VMNewUser

<style>
    table{
        font-family:Tahoma;
    }
</style>
@using (Html.BeginForm("AddNewUser", "User", FormMethod.Post))
{
    <table>

        <tr>
            <td>name</td>
            <td>@Html.TextBoxFor(f=>f.User.FirstName)</td>
        </tr>

        <tr>
            <td>family</td>
            <td>@Html.TextBoxFor(f=>f.User.LastName)</td>
        </tr>

        <tr>
            <td>personalcode</td>
            <td>@Html.TextBoxFor(f=>f.User.PersonalCode)</td>
        </tr>

        <tr>
            <td>nationalcode</td>
            <td>@Html.TextBoxFor(f=>f.User.NationalCode)</td>
        </tr>

        <tr>
            <td colspan="2"><input type="submit" value="create" style="font-family:Tahoma;float:left" /></td>

        </tr>

    </table>

}

2 个答案:

答案 0 :(得分:1)

发送回填充模型的主要原因是,如果处理请求服务器端时出错,则阻止用户重新填充表单。它还向客户端提供有关哪些字段失败以及是否应显示任何特定错误消息的信息。

建议您使用PRG pattern,因此,如果请求 成功,您可以将用户重定向到新页面。在您的情况下,您可以将用户重定向回AddNewUser操作,这将再次向用户显示空表单。

return RedirectToAction("AddNewUser");

答案 1 :(得分:0)

方式1:

HttpPost 方法中,返回操作,而不是像这样返回视图:

return RedirectToAction("AddNewUser");

方式2:

或只是return View()而不传递模型对象,这意味着null模型并且字段不会明显填充:

return View();

方式3:

如果模型有效保存数据并使用空字段返回查看,您也可以这样做,否则将带有填充数据的视图返回给用户。

像这样:

[HttpPost]
    public ActionResult AddNewUser(VMNewUser InModel)
    {
        if(ModelState.IsValid)
        { 
        User user = Utilities.SessionProvider.GetCurrentUser();
        if (user.ID_User == 0)
            return Redirect("Apps.kosarfci.ir");

        RoleType role = (RoleType)RoleDeterminer.RoleDeterminate();

        if (role != RoleType.Center)
        {
            return RedirectToAction("Restriction");
        }
        IUserBL centerUserBL = new CenterUserBL();

        InModel.User.UserName = InModell.User.NationalCode;
        InModel.User.Password = InModell.User.PersonalCode;
        bool confirmedBL = centerUserBL.AddUser(InModel.User);

       _msgList.Add(new Message() { MsgType = MessageType.Success, MsgContent =         MessageProvider.GetMessage(MessageContent.Submit_Success_NewUser) });
        ViewBag.Message = _msgList;

        return View();
        }

        else
        {
         return View(InModel);
        }

    }