我刚刚插入了一项数据。现在我希望我的观点清楚,但事实并非如此

时间:2010-10-06 14:40:39

标签: asp.net-mvc

我使用View在数据库表中添加记录。 单击“提交”后,我希望屏幕清除以备下次插入。 因此,在我的控制器中,我发送一个新的ViewModel,其中包含我的HttpGet和HttpPost的默认值。 但是我发现,一旦我插入了一条记录,所有旧值都会在我的HttpPost之后保留。 我做错了什么?

    [HttpGet]
    [Authorize(Roles = "Administrator, AdminAccounts")]
    public ActionResult Add()
    {
        ViewData["LastPerson"] = string.Empty;

        return View(new EmployeeViewModel()); 
    }

    [HttpPost]
    [Authorize(Roles = "Administrator, AdminAccounts")]
    public ActionResult Add(Employee employee)
    {
        if (ModelState.IsValid)
        {
            var employeeViewModel = new EmployeeViewModel();
            ViewData["LastPerson"] = string.Format("{0} {1} {2}", employee.Forename, employee.Middlenames,
                                    employee.Surname);
            employeeViewModel.Employee = employee;
            employeeViewModel.Employee.Add();
        }
        return View(new EmployeeViewModel());
    }

我的观点看起来像这样;

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/AdminAccounts.master" 
Inherits="System.Web.Mvc.ViewPage<SHP.WebUI.Models.EmployeeViewModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Add
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="AdminAccountsContent" runat="server">

    <% using (Html.BeginForm("Add", "Employee")) {%>
        <%: Html.ValidationSummary(true) %>

        <fieldset>
            <legend>Add Employee</legend>
            <table>
                <tr>
                    <td align="right">
                <%: Html.LabelFor(model => model.Employee.UserName)%>
                   </td>                    
                    <td>
                <%: Html.EditorFor(model => model.Employee.UserName)%>
                <%: Html.ValidationMessageFor(model => model.Employee.UserName)%>
                    </td>
                </tr>
                <tr>
                    <td align="right">
                <%: Html.LabelFor(model => model.Division.DivisionId) %>
                   </td>                    
                    <td>
                <%: Html.DropDownListFor(model => model.Division.DivisionId, Model.DivisionSelectList, "<--Select-->")%>
                <%: Html.ValidationMessageFor(model => model.Division.DivisionId)%>
                    </td>
                </tr>
                <tr>
                    <td align="right">
                <%: Html.LabelFor(model => model.Department.DepartmentId) %>
                   </td>                    
                    <td>
                <%: Html.DropDownListFor(model => model.Department.DepartmentId, Model.DepartmentSelectList, "<--Select-->")%>
                <%: Html.ValidationMessageFor(model => model.Department.DepartmentId) %>
                    </td>
                </tr>

                <tr>
                    <td align="center" colspan="2" style="padding-top:20px;">
                    <input type="submit" value="Save" /></td>
                </tr>
            </table>
            <% if (ViewData["LastPerson"].ToString().Length > 0)
               { %>
                <p>
                   At time <% Response.Write(DateTime.Now.ToString("T")); %> 
                   - You have just entered <%Response.Write(ViewData["LastPerson"].ToString()); %>.
                </p>
             <%} %>
        </fieldset>

    <% } %>

    <div>
        <%: Html.ActionLink("Back to List", "Index") %>
    </div>

    <script language="javascript" type="text/javascript">

        //Hook onto the DivisionId list's onchange event
        $("#Division_DivisionId").change(function () {
            //build the request url
            var url = '<%: Url.Content("~/")%>' + "Employee/GetDepartments";
            //fire off the request, passing it the id which is the DivisionId's selected item value
            $.getJSON(url, { divisionId: $("#Division_DivisionId").val() }, function (data) {
                //Clear the Department list
                $("#Department_DepartmentId").empty();
                $("#Department_DepartmentId").append("<option><--Select--></option>");
                //Foreach Department in the list, add a department option from the data returned
                $.each(data, function (index, optionData) {
                    $("#Department_DepartmentId").append(
                    "<option value='" + optionData.DepartmentId + "'>" +
                        optionData.DepartmentName + "</option>");
                });
           });
        }).change();

    </script>

1 个答案:

答案 0 :(得分:2)

ModelState可以让你对它最终记住的数据感到惊讶。但是,在您的情况下,您应该只是重定向到空白页面,而不是直接返回View(model)

return RedirectToAction("Add");

而不是:

return View(new EmployeeViewModel());

提交表单后,如果用户刷新浏览器会发生什么?根据您的设计,它将重新回发表单数据,这是不好的。重定向将解决该问题。有关详细信息,请参阅此处:http://en.wikipedia.org/wiki/Post/Redirect/Get