2017-10-17 171 views
0

我正在使用ajax.beginform在另一個視圖中創建局部視圖。Ajax.beginForms MVC局部視圖

我用戶輸入正確的sn一切正常。 但是,如果用戶輸入一個無效的號碼,我想重定向到索引視圖。

現在,索引頁面本身作爲局部視圖提交。

我該如何避免這種情況。

這是我的觀點和2個簡化的動作結果的一部分。

@using (Ajax.BeginForm("MachineInfo", "QrCreate", new AjaxOptions() { 
HttpMethod = "POST", UpdateTargetId = "form-content", InsertionMode = 
InsertionMode.ReplaceWith })) 
{ 
      @Html.AntiForgeryToken() 

      <input type="text" id="sn" name="sn" class="inputsn" 
       placeholder="Enter your serial number here..." /> 

      <input type="submit" value="Search" class="search btn btn-success btn-lg" /> 

} 
    </div> 

</div> 
<div id="form-content"></div> 

我控制器

public ActionResult Index(bool? isValidMachine = null) 
    { 
     ViewBag.invalidSerialNumber = isValidMachine; 
     return View(); 
    } 
    [HttpPost] 
    public ActionResult MachineInfo(string sn) 
    { 

     if(string.IsNullOrEmpty(sn)) 
     RedirectToAction("Index", new { isValidMachine = false }); 


     QrCreateViewModel qrCreateVM; 
     using (var machineService = new MachineApiService()) 
     { 

      var machine = machineService.GetMachineFromSerialNumber(sn); 
      if (machine == null) 
       return RedirectToAction("Index", new { isValidMachine = false }); 
      else 
      qrCreateVM = new QrCreateViewModel(machine, GetBasePath()); 
     } 

     if (qrCreateVM.IsValid()) 
     { 
      qrCreateVM.Viewurl = qrCreateVM.QrCreateUrlOrDefaultNull(); 
      return PartialView(qrCreateVM); 
     } 

     else 
     return RedirectToAction("Index", new { isValidMachine = false }); 
    } 
+1

Ajax調用不能重定向 - 他們的整點是留在同一頁上。一種選擇是在不返回部分視圖的情況下拋出一個Http Error,然後使用'OnFailure' ajax選項來調用一個腳本,重定向到你的'Index()'方法(儘管這更容易你擺脫了過時的'Ajax.BeginForm()'並使用'$ .ajax()',這給你更多的靈活性 –

+0

謝謝你的回答我試圖找出你的第一個建議,它的工作原理,我知道beter選項是與jquery Ajax一起工作的,但是這個決定並不在我的手中 我不想接受你的評論作爲一個很好的答案,但那是行不通的 –

+0

它遲到了,但我會添加在早上的詳細答案 –

回答

2

Ajax調用不重定向(使他們的目的是要留在同一頁上)。

在你的控制器的方法,更換的return RedirectToAction(...)的情況下返回一個HttpStatusCodeResult指示錯誤,然後你就可以在OnFailure選項處理重定向到Index()方法。

例如

[HttpPost] 
public ActionResult MachineInfo(string sn) 
{ 

    if (string.IsNullOrEmpty(sn)) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Bad Request"); 
    } 
    .... 

然後在Ajax.BeginForm()

@using (Ajax.BeginForm("MachineInfo", "QrCreate", new AjaxOptions() { 
    HttpMethod = "POST", 
    UpdateTargetId = "form-content", 
    InsertionMode = InsertionMode.ReplaceWith, 
    OnFailure = "redirect" 
})) 
{ 
    .... 

,並添加下面的腳本重定向

function redirect(ajaxContext) { 
    location.href = '@Url.Action("Index")'; 
} 
+0

該代碼充滿了Ajax。*助手。 我知道你有更多的靈活性,如果你使用JQuery的AJAX。 但我想如果這影響到性能? –

+0

只有你必須在視圖中加載'jquery.unobtrusive-ajax.js'文件的事實,但它很小。作爲一個方面說明,不再支持'Ajax'助手 –

+0

如果有暴風雪和我在同一棟建築中被封鎖2天,我會對它們進行重構:) –