【问题标题】:why model posted to action Display in view?为什么模型发布到行动显示在视图中?
【发布时间】:2014-04-22 20:31:49
【问题描述】:

有 2 个同名操作。(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>

}

【问题讨论】:

  • 发布到模型并保存后,将用户重定向到AddNewUser(Httpget)或在AddNewUser(HttpPost)末尾调用"return RedirectToAction("AddNewUser")"。

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


【解决方案1】:

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

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

return RedirectToAction("AddNewUser");

【讨论】:

    【解决方案2】:

    方式一:

    在您的 HttpPost 方法中返回 Action 而不是像这样返回视图:

    return RedirectToAction("AddNewUser");
    

    方式 2:

    或者只是 return View() 没有传递 Model 对象,这意味着 null 模型和字段将不会被明显填充:

    return View();
    

    方式 3:

    您也可以这样做,如果 Model 是有效的保存数据并返回带有空字段的 View,否则返回带有填充数据的视图给用户。

    像这样:

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

    【讨论】:

    • 我认为 best 方法实际上是第一选择。如果 OP 按下 F5,则使用您推荐的最佳方法,系统将提示他们重新提交请求。第一种方法遵循 PRG 模式。
    • 删除了最佳标签...:)
    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多