2017-09-23 70 views
0

我有一个简单的登录控制器:Knockoutjs不能去RedirectToAction视图

public ActionResult Login() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Login(string userName, string passWord) 
{ 
    if (ModelState.IsValid) 
    { 
     var employee = 
     db.Employees.FirstOrDefault(x => x.EmployeeNo == userName && x.Password == passWord && x.StatId == 1); 

     if (employee != null) 
     { 
      return RedirectToAction("Index"); 
     } 

    } 

    return View(); 
} 


public ActionResult Index() 
{ 
    return View(db.Employees.ToList()); 
} 

这是我的看法这势必一个knockoutjs文件:

@model SimpleLogin.Models.Employee 

@{ 
    ViewBag.Title = "Login"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Login</h2> 

<span>User</span> &nbsp; <span data-bind="text: userName"></span> <br/> 
<span>Password</span> &nbsp; <span data-bind="text: passWord"></span> 
<div> 
    <table> 
     <tr> 
      <td> 
       <input type="text" name="txtUserName" placeholder="User Name" data-bind="value: userName" /></td> 
     </tr> 
     <tr> 
      <td> 
       <input type="password" name="txtPassword" placeholder="Password" data-bind="value: passWord"/></td> 
     </tr> 
    </table> 

    <button data-bind="click: logUser">Login</button> 
</div> 


@section Scripts 
    { 
    @Scripts.Render("~/bundles/jquery") 
    @Scripts.Render("~/bundles/knockout") 
    @Scripts.Render("~/Knocks/LoginVm.js") 
} 

这是我的淘汰赛LoginVm。 JS

$(function() { 
    ko.applyBindings(LoginVm); 
}); 

var LoginVm = { 
    userName: ko.observable(''), 
    passWord: ko.observable(''), 

    logUser: function() { 
     var self = this; 

     $.ajax({ 
      url: '/Company/Login', 
      type: 'post', 
      dataType: 'json', 
      data: ko.toJSON(self), 
      contentType: 'application/json', 
      success: function(data) { 
       //window.location.href = '/Company/Index'; //I tried putting an alert here but doesn't work. why? 
      } 
     }); 
    } 
}; 

当我运行应用程序,我把一个破发点,在“如果(ModelState.IsValid)”控制器。它运行良好。它甚至执行“返回RedirectToAction(”索引“)”,但问题是,页面停留在登录视图中,并且从未加载索引视图。为什么?我做错了什么?

我也把这个:

bundles.Add(new ScriptBundle("~/bundles/knockout").Include(
         "~/Scripts/knockout-2.1.0.js", 
         "~/Scripts/knockout-2.1.0.debug.js")); 
在BundleConfig.cs

我不习惯JS,这真的让我困惑。我知道我所做的有两个以上的错误。

这是我

public class Employee{ 
public int EmployeeId {get; set;} 
public string UserName {get; set} 
public string Password {get; set;} 
} 
+1

你做了一个ajax调用 - 他们的重点是呆在同一页面(ajax调用永不重定向) –

+0

哇!不知道!谢谢 – NoobProgger

回答

1

你不能return View一个Ajax请求。你应该将其更改为:

public ActionResult Login(string userName, string passWord) 
{ 
    if (ModelState.IsValid) 
    { 
     var employee = 
     db.Employees.FirstOrDefault(x => x.EmployeeNo == userName && x.Password == passWord && x.StatId == 1); 

     if (employee != null) 
     { 
      return Json(true); 
     } 
    } 

    return Json(false); 
} 

然后在您的JS:

$.ajax({ 
     url: '/Company/Login', 
     type: 'post', 
     dataType: 'json', 
     data: ko.toJSON(self), 
     contentType: 'application/json', 
     success: function(data) { 
      if(data) { 
       window.location.href = '@Url.Action("Index", "Company")'; 
      } 
     } 
    }); 

但没有必要在这里使用的淘汰赛。您可以简单地在控制器中执行常规表单Submit和按return RedirectToAction("Index", "Company")重定向。

+0

我明白了!但后续问题,我如何保留已登录的对象(已在var employee = db.Employees.FirstOrDefault中检索到的对象)? – NoobProgger

+0

使用敲除 – NoobProgger

+0

@NoobProgger如果你想设置和访问你的控制器中的用户数据,你可以使用'Session'。如果你想用javascript访问它,你可以[sessionStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage)。 – adiga