#c# #jquery #asp.net-mvc #asp.net-mvc-4 #razor
#c# #jquery #asp.net-mvc #asp.net-mvc-4 #razor
Вопрос:
Я очень новичок в Razor MVC, и я не могу понять, как подключить функцию щелчка элемента ввода HTML к ActionResult. Вот мой код:
Я взял этот код из файла Login.cshtml в проекте и поместил его в Index.cshtml:
@model S2GPortal.Models.LoginModel
.
.
.
<section id="featured">
<h2>Use a local account to log in.</h2>
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Log in Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</li>
<li>
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" })
</li>
</ol>
<input type="submit" value="Log in" />
</fieldset>
<p>
@*@Html.ActionLink("Register", "Register")*@ if you don't have an account.
</p>
}
</section>
Это, в свою очередь, вызовет метод Login ActionResult на контроллере AccountController. Когда это было в представлении входа. Поскольку я поместил ее в представление индекса, метод входа в систему больше не вызывается, и я не могу понять, как перепрограммировать его, чтобы он выглядел в том же контроллере. Я не уверен, как MVC знал, что раньше вызывал этот конкретный логин ActionResult. Вот контроллер:
public class AccountController : BaseController
{
//
// GET: /Account/Login
[Inject]
public ISystemUserRepository SystemUserRepository { get; set; }
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
if (WebSecurity.IsAuthenticated)
{
string currentUser = WebSecurity.CurrentUserName;
int test = 1;
}
ViewBag.ReturnUrl = returnUrl;
return View();
}
//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid amp;amp; WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
PortalSession.User = SystemUserRepository.GetByEmail(model.UserName);
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
Итак, вкратце, как представление узнает, что нужно искать в определенном контроллере для вызова ActionResult, и как строка, подобная этой: знать, какой ActionResult вызывать?
Спасибо!
Ответ №1:
вы должны использовать эту перегрузку Html.BeginForm
:
@using (Html.BeginForm("Login", "Account", FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl }))
{
// your form elements
}
1) Первый параметр — ActionName
2) Второе имя контроллера
3) Метод третьей формы в вашем случае это будет post, поскольку мы публикуем данные
4) и четвертое — значения маршрута
ваш окончательный вид будет выглядеть так:
@model S2GPortal.Models.LoginModel
<section id="featured">
<h2>Use a local account to log in.</h2>
@using (Html.BeginForm("Login", "Account", FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Log in Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</li>
<li>
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" })
</li>
</ol>
<input type="submit" value="Log in" />
</fieldset>
}
</section>
Теперь при нажатии кнопки отправки ваша форма будет опубликована при входе в действие контроллера учетной записи, и помните, что форма будет опубликована только с <input type="submit"/>
помощью кнопки, кнопка или ссылка не будут работать.