Не уверен, как подключить кнопку ввода HTML к новой функции ActionResult

#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"/> помощью кнопки, кнопка или ссылка не будут работать.