在调用代码后避免回发

时间:2016-01-29 10:52:38

标签: javascript c# asp.net twitter-bootstrap

所以我试图在ASP表单上做一些输入验证,如果验证失败,它不应该尝试提交表单,而只是显示一个带有错误的模态窗口(bootstrap),然后让用户修复错误/填写他们忘记的空白。

但每当我按下我的HTML按钮(或ASP按钮我都试过)时,它会显示模态窗口并立即进行回发。我可以看到发生这种情况是因为我必须上传丢失文件引用的字段,并且我还有一个动态创建的下拉列表,它也会重置。

我想找到一种解决方法,但在看了几个SO答案后,我找不到解决方案。

使用流行的return false;解决方案会使提交按钮停止工作。

我的HTML:

<div class="row">
    <script>
        function activityAdd() {
            __doPostBack('Activity_Add', 'postback');
        };
    </script>
    <asp:Button CssClass="btn btn-success" Style="font-size: 20px;" runat="server" OnClientClick="activityAdd();" Text="Submit"/>
    <a class="btn btn-danger" runat="server" href="~/Index" style="font-size: 20px;">Cancel</a>
</div>

C#Page_Load:

protected void Page_Load(object sender, EventArgs e)
{
    ScriptManager.RegisterStartupScript(this, typeof(Page), "CreateDepartmentDropdown", "$(document).ready(function(){CreateDepartmentDropdown(" + GetDepartmentDropdownList() + ");});", true);
    ScriptManager.RegisterStartupScript(this, typeof(Page), "RegisterDatepickers", "$(document).ready(function(){RegisterDatepickers();});", true);
    //Activity_Add.Attributes.Add("onClick", "return false;");
    //Activity_Add.Click += Activity_Submit_Click;
    if (Request["__EVENTARGUMENT"] == "postback")
    {
        SubmitActivity();
    }
}

提交方法:

public bool SubmitActivity()
{
    bool InputValidated = true;
    List<String> ErrorMessages = new List<String>();

    int fye = Int32.Parse(fye_dropdown.Value);
    String activityName = activity_name_field.Value;
    String[] ax_accounts = (ax_account_numbers_field.Value.Contains(',') ? ax_account_numbers_field.Value.Split(',') : new String[1] { ax_account_numbers_field.Value });

    if (activityName.Length == 0)
    {
        InputValidated = false;
        ErrorMessages.Add("The Activity Name is not filled.");
    }
    String activity_responsible = responsible_field.Value;
    int department;

    if (department_dropdown_selected_value.Value.Length == 0)
    {
        department = 0;
    }
    else
    {
        department = Int32.Parse(department_dropdown_selected_value.Value);
    }

    DateTime start;
    DateTime end;

    // Since the dates are formatted for Americans we will rearrange day and month in code.
    // Otherwise the JavaScript that checks the two Calendars break and we can't parse a DateTime object.
    try
    {
        String[] date = datepicker_start.Value.Split('/');
        String parseString = date[1] + "/" + date[0] + "/" + date[2] + " 00:00:00 AM";
        start = DateTime.Parse(parseString);
    }
    catch (Exception)
    {
        InputValidated = false;
        ErrorMessages.Add("The Start Date was not formatted right. Please only click in the box and choose a date from the calendar.");
    }

    try
    {
        String[] date = datepicker_start.Value.Split('/');
        String parseString = date[1] + "/" + date[0] + "/" + date[2] + " 00:00:00 AM";
        end = DateTime.Parse(parseString);
    }
    catch (Exception)
    {
        InputValidated = false;
        ErrorMessages.Add("The End Date was not formatted right. Please only click in the box and choose a date from the calendar.");
    }

    if (ax_accounts[0].Length == 0)
    {
        InputValidated = false;
        ErrorMessages.Add("You need to add at least one AX Account for the Activity.");
    }

    if (!description_upload.HasFile)
    {
        InputValidated = false;
        ErrorMessages.Add("Please choose a file to upload for the Detailed Description of the Activity");
    }

    if (!estimation_upload.HasFile)
    {
        InputValidated = false;
        ErrorMessages.Add("Please choose a file to upload for the Estimation of the Activity.");
    }

    if (InputValidated == false)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("An Error happened while submitting the activity. Please see below for details.");
        sb.Append("<br>");
        foreach (String msg in ErrorMessages)
        {
            sb.Append("- ").Append(msg).Append("<br>");
        }
        String jsExec = Util.ModalAlert(sb.ToString(), "#error_modal", ".modal-body");
        ScriptManager.RegisterStartupScript(Page, GetType(), "error_modal_show", jsExec, false);
        return false;
    }
    else
    {
        byte[] descriptionBytes = description_upload.FileBytes;
        String descriptionFileName = description_upload.FileName;

        byte[] estimationBytes = estimation_upload.FileBytes;
        String estimationFileName = estimation_upload.FileName;

        String msg = Util.Alert("Success");
        Response.Write(msg);
        return true;
    }
}

但这也不像预期的那样有效。前面提到的所有字段仍然重置。这让我感到愤怒,因为这对用户来说将是一次令人沮丧的经历。关于如何处理这个问题的任何想法?

0 个答案:

没有答案