2017-09-23 4 views
0

에 갈 수Knockoutjs 내가 간단한 로그인 컨트롤러가 RedirectToAction보기

@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입니다. 나는 응용 프로그램을 실행

$(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? 
      } 
     }); 
    } 
}; 

JS, 나는에 브레이크 포인트를 넣어 "만약 (ModelState.IsValid)"컨트롤러. 괜찮 았어. 그것은 "return RedirectToAction ("Index ")를 실행하기는했지만 문제는 페이지가 로그인보기에 머물러 있으며 인덱스보기를로드하지 않은 것입니다. 왜? 나는 무엇을 잘못 했는가?

나는이를 넣어 다음 BundleConfig.cs

에서

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

을 내가 JS에 익숙하지 않아요, 정말 나를 혼란. 내가 한 것에 2 가지 이상의 오류가 있음을 압니다.

이 내 수업

아약스 요청에
public class Employee{ 
public int EmployeeId {get; set;} 
public string UserName {get; set} 
public string Password {get; set;} 
} 
+1

당신은 아약스 전화를 걸었습니다 - 그들 모두는 같은 페이지에 머무르는 것입니다 (아약스 전화는 결코 리다이렉트하지 않습니다) –

+0

와우! 그걸 몰랐어! 덕분에 – NoobProgger

답변

1

할 수 있습니다하지 return View입니다. 당신의 js에서 다음

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); 
} 

:

$.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