2016-11-25 8 views
1

私は自分のASP.NETプロジェクトに由来する独自のログインフレームワークを実装しようとしており、現在はASP.NET MVCに移行しようとしています。MVCログインフォーム - リソースが見つかりません

問題

たび私は CommunityBar.cshtmlで送信ボタンをクリックして、私はにリダイレクトしています: localhost/Home/Login?Length=4と受信 resource not found errorが、私たちの便利な友人、グーグル、私と一緒に、この問題の最後の数時間を過ごしましたまだ解決策を見つけていない。だから私はここの誰かが手伝ってくれることを望んでいた。

次にコードの束:

RouteConfig.cs

// POST home/login 
routes.MapRoute(
    name: "Login", 
    url: "Home/Login/{model}/{returnUrl}", 
    defaults: new { controller = "Home", action = "Login" } 
    ); 

CommunityBar.cshtml

@using (Html.BeginForm("Login", "Home", new {ReturnUrl = ViewBag.ReturnUrl}, FormMethod.Post, new {role = "form"})) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true, "", new {@class = "danger"}) 
    @Html.TextBoxFor(m => m.LoginUsername, new {@class = "form-input", @placeholder = "Username"}) 
    @Html.ValidationMessageFor(m => m.LoginUsername, "", new {@class = "danger"}) 
    @Html.TextBoxFor(m => m.LoginPassword, new {@class = "form-input", @placeholder = "Password"}) 
    @Html.ValidationMessageFor(m => m.LoginPassword, "", new {@class = "danger"}) 
    @Html.ActionLink("Sign In", "Login", "Home", new {@class = "form-btn"}) 
} 

HomeController.cs

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Login(UserViewData model, string returnUrl) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 

    return Content("test"); 
    //return RedirectToLocal(returnUrl); 
} 

UserViewDataモデル

public class UserViewData 
{ 

    [Required] 
    [DataType(DataType.Text)] 
    public string LoginUsername { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    public string LoginPassword { get; set; } 

    public MembershipUser User { get; private set; } 
    public bool HasMessages { get; private set; } 
    public List<MembershipUserPrivateMessage> Messages { get; private set; } 
    public bool HasNotifications { get; private set; } 
    public List<Subscription> Subscriptions { get; private set; } 

    public UserViewData(MembershipUser user) 
    { 
     UserService userService = new UserService(); 

     this.User = user; 
     this.HasMessages = userService.CountUnreadPrivateMessages() > 0; 
     this.Messages = userService.GetPrivateMessages(false).Where(p => !p.IsRead).Take(5).ToList(); 
     this.HasNotifications = false; 
     this.Subscriptions = null; 
    } 
} 

EDIT:一つの可能​​な解決策は、POCO構造に

RouteConfig.cs

// POST home/login 
routes.MapRoute(
    name: "Login", 
    url: "Home/Login/", 
    defaults: new { controller = "Home", action = "Login" } 
); 

CommunityBar.cshtml

を避けるためです
@using (Html.BeginForm("Login", "Home", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 
    <input type="text" name="username" class="form-input" placeholder="Username"/> 
    <input type="text" name="password" class="form-input" placeholder="Username"/> 
    <input type="submit" value="Sign In"/> 
} 

HomeController.cs

// POST: /Home/Login 
[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Login(string username, string password) 
{ 
    if (!ModelState.IsValid) 
    { 
     return Content("fail"); 
    } 

    return Content("success" + username + password); 
} 

これは本当に実際のソリューションよりも、問題を隠すためだけの方法であると私は個人的に、これを好きではありません。だから、誰かが元のコードで問題が何であるかを考えれば、私はこの問題を生き生きとしていきます。または私は...

+0

@Div上のモデルを渡していることを確認する必要があり、おそらく私はルートなしで試してみましたことを、言及している必要があります。失敗... –

+0

あなたのルートには、あなたのURLに提供されていないような{model}パラメータがあります。ルートから{model}を削除し、それが役立つかどうか確認してください。 – Vahid

+0

@Vahid、残念ながら同じ結果です。 –

答えて

0

RouteConfig.csはこの形式で問題ありません。 OPでのアクションリンクがちょうど

@using (Html.BeginForm("Login", "Home", new {ReturnUrl = ViewBag.ReturnUrl}, FormMethod.Post, new {role = "form"})) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true, "", new {@class = "danger"}) 
    @Html.TextBoxFor(m => m.LoginUsername, new {@class = "form-input", @placeholder = "Username"}) 
    @Html.ValidationMessageFor(m => m.LoginUsername, "", new {@class = "danger"}) 
    @Html.TextBoxFor(m => m.LoginPassword, new {@class = "form-input", @placeholder = "Password"}) 
    @Html.ValidationMessageFor(m => m.LoginPassword, "", new {@class = "danger"}) 
    <!-- Remove action link and add Submit button here --> 
    <button class="form-btn" type="submit">Sign In</button> 
} 

UserViewDataモデルにパラメータ以下のコンストラクタを必要とするページにバックリンクアクションタグをレンダリングするよう

// POST home/login 
routes.MapRoute(
    name: "Login", 
    url: "Home/Login/", 
    defaults: new { controller = "Home", action = "Login" } 
); 

CommunityBar.cshtmlは、フォームを送信する方法がありませんポストにモデルバインダーがモデルを作成できるようにします。現在は依存関係が必要です。また、このモデルには複数の役割があるように見えます。シンプルなPOCOを使用してください。

public class LoginModel {  
    [Required] 
    [DataType(DataType.Text)] 
    public string LoginUsername { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    public string LoginPassword { get; set; } 
} 

HomeController.csそれは、元の取得

[HttpGet] 
[AllowAnonymous] 
public ActionResult Login() { 
    var model = new LoginModel();//also why default constructor needed 
    return View(model); 
} 

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult Login(LoginModel model, string returnUrl) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 

    //...login logic here 

    //if reach this far then redirect 
    if (!string.IsNullOrWhiteSpace(returnUrl)) { 
     return RedirectToLocal(returnUrl); 
    } else { 
     return this.RedirectToAction("MyActionNameHere"); 
    } 
} 
+0

登録UserViewData、私はかなりの情報を同じビューに渡す必要があります。したがって、私は "LoginModel"をUserViewDataに組み込んだのです。 LoginModelでそれを行う必要がありますか? (私はこのコメントで十分に自分自身を明確にしたかどうかはわかりません) –

+0

まだ明確ではありません。例は非常に単純化されたビューを示しています。その答えは – Nkosi

+0

に基づいています。本質的に2つのモデル、「LoginViewModel」と私のUserViewDataの必要性を取り入れる。これを独自の「結合された」ViewModelにすることはできますか?必要なデータと、フォームに必要なLoginViewModelの両方がありますか?その後、フォームはまだ動作しますか? –

関連する問題