【问题标题】:Alternative to Response.Redirect in WebmatrixWebmatrix 中 Response.Redirect 的替代方案
【发布时间】:2013-03-26 13:38:58
【问题描述】:

我正在为机械师编写一份检查清单,所以所有内容都使用单选按钮和下拉菜单(废话!)。可能有超过 50 个项目,因此在 url 中传递值会很混乱。如果我使用 POST 发送表单,所有变量值都会被传递,但我需要使用 Response.Redirect 来让表单写入数据库并阻止变量传递到下一页。我已经尝试过 META 刷新和 Response.StatusCode = 307;但到目前为止没有任何效果。这是第一页....

@{

var UNITNO = "";
var DATE = DateTime.Now;
var MECHANIC = "";
var HEADLIGHTS = "";
var TailStopSignalHazard = "";

   if(IsPost)
   { 

UNITNO = Request.Form["UNITNO"];
MECHANIC = Request.Form["MECHANIC"];
HEADLIGHTS = Request.Form["HEADLIGHTS"];
TailStopSignalHazard = Request.Form["TailStopSignalHazard"];

    var db = Database.Open("MAINT");
    var insertCommand = "INSERT INTO CHECKLIST (UNITNO, DATE, MECHANIC, HEADLIGHTS, TailStopSignalHazard) Values(@0, @1, @2, @3 ,@4)";
    db.Execute(insertCommand, UNITNO, DATE, MECHANIC, HEADLIGHTS, TailStopSignalHazard);
    Response.StatusCode = 307;
    Response.Redirect("list.cshtml");
    //<META http-equiv="REFRESH" content="0; url=list.cshtml">    
}

<script type="text/javascript">
function validateForm() {
    var aa = document.getElementById("UNITNO");
    var ac = document.getElementById("MECHANIC");
    var xx = document.getElementsByName("HEADLIGHTS");
    var xz = document.getElementsByName("TailStopSignalHazard");

    if (aa.options[aa.selectedIndex].index == 0) { alert("Must enter Unit Number"); return false; }
    if (ac.options[ac.selectedIndex].index == 0) { alert("Must enter Mechanic"); return false; }
    if (xx[0].checked == false && xx[1].checked == false) { alert("Must enter Headlights"); return false; }
    if (xz[0].checked == false && xz[1].checked == false) { alert("Must enter Tail/Stop/Signal/Hazard"); return false; }
}
</script>
}


<!DOCTYPE html>
<html>

<head>
<meta charset="utf-8" />
    <title>Western Check List</title>
</head>

<body>

  <h1>Western Disposal</h1>
  <!-- <form method="post" onsubmit="return validateForm()" action="list.cshtml"> //-->
  <form method="post" onsubmit="return validateForm()">
  <fieldset>
  <legend>Check List</legend>
        &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp

        <script>
        date=Date()
        document.write(date)
        </script> 

<p>
        <label> Unit Number: </label> 
        <select name="UNITNO">
        <option value=""></option>
        <option value="108">108</option>
        <option value="110">110</option>
        <option value="111">111</option> 
        </select>  
 </p>


 <p>
        <label>Mechanic:</label>
        <select name="MECHANIC" >
        <option value=""></option>
        <option value="BOB">BOB</option>
        <option value="DANIEL">DANIEL</option>
        <option value="DOUG">DOUG</option>
        </select>
 </p>

 <p>
   <b>  LIGHTING:  </b>
 </br>
     <label>&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &rlm; &nbsp Head Lights:</label>
     <input type="RADIO"  name="HEADLIGHTS" value="GOOD"/>GOOD &nbsp &nbsp
     <input type="RADIO"  name="HEADLIGHTS" value="BAD"/>BAD

   </br>
     <label>&nbsp Tail/Stop/Signal/Hazard:</label>
     <input type="RADIO" name="TailStopSignalHazard" value="GOOD"/>GOOD &nbsp &nbsp
     <input type="RADIO" name="TailStopSignalHazard" value="BAD"/>BAD

 </p>

  <p><input type="submit" value="POST"/></p>
 </fieldset>
  </form>

 </body>

 </html>

然后我用这个检查第二页上的数据库和“UNITNO”的值......

   @{
var db=Database.Open("MAINT");
var grid=new WebGrid(db.Query("SELECT * FROM CHECKLIST ORDER BY ID"));
 }
 <!DOCTYPE html>
  <html>
  <head>
    <title>Western Check List Data Base</title>
    <style type="text/css">
        table {border-collapse:  collapse;}
        td, th {border:  solid 1px; }
    </style>
   </head>
    <body>
     <h1>Western Check List Data Base</h1>
    @grid.GetHtml()
    <a href="Default.cshtml">RETURN</a>
    &nbsp &nbsp &nbsp &nbsp the unit number was="@Request["UNITNO"]"
    </body>

      </html>

我是 webmatrix 的新手和脚本新手,所以请原谅我的无知。我希望有人对我的问题有一个简单的解决方案,我也尝试了全局变量,但要么我没有正确格式化它,要么它也不起作用。感谢阅读!

【问题讨论】:

  • 是第二页上的意图,您会看到曾经检查过的所有 unitID 的列表吗?这就是它似乎是用没有 WHERE 子句的“Select * from...”编码的方式。
  • 是的,没错。然而,这只是一个临时页面,用于验证我是否将数据写入数据库,并且我已经继承了隐藏变量“UNITNO”的值,实际网站将在检查列表中有更多项目,结果页面会询问了解每个检查为 BAD 的项目的说明,然后将该信息通过电子邮件发送给经理。

标签: forms variables webmatrix response.redirect


【解决方案1】:

您可以将一些数据传递给重定向上的第二个脚本:

Response.Redirect("list.cshtml?UNITNO=" + Request.Form["UNITNO"]);

但如果您需要发送大量数据,那可能会变得一团糟。更好的方法是发送新创建记录的数据库 ID。然后,您可以在第二个脚本上再次打开它并读取并显示您喜欢的任何数据:

Response.Redirect("list.cshtml?id=" + db.GetLastInsertId());

我自己的一般规则是,如果我正在执行重定向并需要维护数据,我可能应该考虑重构代码以尽可能不需要它 - 但上面的解决方案应该有效。

【讨论】:

    【解决方案2】:

    试试

    Response.Redirect("list.cshtml/" + Request.Form["UNITNO"]);
    

    我发现使用

    Response.Redirect("list.cshtml?UNITNO=" + Request.Form["UNITNO"]);
    

    确实有效,但如果您在表单开头使用 var UNITNO,则 URL 将传递 list.cshtml=UNITO xxx 无论 UNITNO 是什么,这并不总是通过,具体取决于您在表单中获取 URL var 的方式。

    只需将 ?UNITNO 替换为简单的 / 那么该请求对我来说效果很好。

    但是已经给出的答案也将起作用,所以我敲了它,但我发现我遇到了问题,并用这种对我有用的方法调整了原始答案。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2015-03-03
      • 2015-09-25
      • 2019-12-16
      相关资源
      最近更新 更多