2016-11-25 62 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; 
    } 
} 

编辑:一种可能的解决方案,是为了避免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

在您的路线中,我可以看到似乎未在您的网址中提供的{model}参数。尝试从路线中移除{model},看看是否有帮助。 – Vahid

+0

@Vahid,不幸的是同样的结果。 –

回答

0

RouteConfig.cs在这种格式中很好。

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

CommunityBar.cshtml没有办法提交表单作为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模型需要一个参数的构造函数来允许模型联编程序在后期创建模型。目前它需要依赖性。也看起来这个模型有多个角色。使用一个简单的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

Reg。 UserViewData,我需要将相当多的信息传递给相同的视图。因此,我将“LoginModel”组合到UserViewData中。我仍然需要用你的LoginModel来做到这一点吗? (我不知道在这个评论中我是否足够清楚) –

+0

还不清楚。示例显示了非常简化的视图。回答是基于那 – Nkosi

+0

为了结合基本上需要两个模型,您的“LoginViewModel”和我的UserViewData。我可以将它制作成它自己的“Combined”ViewModel,所以我有我需要的数据和表单需要的LoginViewModel?之后,这个表单还能工作吗? –