我想实现我自己的登录框架,它源自我的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);
}
我个人不喜欢这一点,因为这是真的只是一个隐藏不是实际的解决问题的方式。所以我会保持这个问题的活力,如果有人认为我们的问题是原始代码。或者我做...
@Div,或许应该提到,我已经没有路线尝试。没有成功... –
在您的路线中,我可以看到似乎未在您的网址中提供的{model}参数。尝试从路线中移除{model},看看是否有帮助。 – Vahid
@Vahid,不幸的是同样的结果。 –