#asp.net #asp.net-mvc #validation #model-view-controller
#asp.net #asp.net-mvc #проверка #модель-представление-контроллер
Вопрос:
У меня есть следующий код. Я также добавил необходимые файлы сценариев для проверки полей, но проверка, похоже, не работает. Требуемые поля могут быть пропущены, даже если пользователь не вводил никаких входных данных. Может кто-нибудь, пожалуйста, помочь? Спасибо! Я опубликовал часть кода ниже. В моем исходном коде намного больше выпадающих меню, и ни одна из проверок формы не работает.
Модель:
public class User
{
[Required]
[Display(Name = "Gender")]
public string gender { get; set; }
}
}
Вид:
<body>
<div>
<div class="card">
<div class="row" style="padding-left:360px;">
<p style="font-size:25px; font-weight: bold; text-align:center; padding-top: 50px; text-
align : center;"><u>Tell Us a Bit about Yourself! </u></p>
</div>
@using (Html.BeginForm("Register", "Register", FormMethod.Post, new { @class = "my_form" }))
{
@Html.ValidationSummary(true, "", new
{
@class ="text-danger"
})
<table class="row" style="background-color:rgba(0, 0, 0, 0);">
<tr>
<td>
@Html.LabelFor(model => model.gender,
htmlAttributes: new { @class = "register.css" })
</td>
<td>
<div>
@Html.DropDownListFor(model => model.gender,
new SelectList(Enum.GetValues(typeof(Gender))), "Select Gender"
)
@Html.ValidationMessageFor(model =>
model.gender, "", new { @class = "text-danger" })
</div>
</td>
</tr>
<tr>
<td></td>
<td class="please-no">
<div>
<button type="submit" class="btn btn-primary" style="
float:right; padding: -20px;">Next</button>
</div>
</td>
</tr>
</table>
}
</div>
<script>
@section scripts{
@Scripts.Render("~/bundles/jqueryval")
}
Контроллер:
[HttpGet]
public ActionResult Register()
{
return View(new User());
}
[HttpPost]
public ActionResult Register(User user)
{
if (ModelState.IsValid)
{
return RedirectToAction("Register");
}
Session["user"] = user;
return RedirectToAction("PersonalPreference", "Preference");
}
Комментарии:
1. Это вид, который вы редактируете
_Layout.cshtml
? Я спрашиваю, потому что вижу<body>
отображение тега и скрипта. Я также не вижу@model
вверху директивы, в которой указано, что представление может ожидатьUser
, что ему будет передан экземпляр. Если это не_Layout.cshtml
так, или пользовательский макет, что маловероятно, если вы только начинаете, представления не требуют<body>
определения. Если вы посмотрите,_Layout.cshtml
там есть вызов @RenderBody() . Это вводит выходные данные (т.Е. HTML, JS) из вашего контроллера (контроллеров) в макет, поэтому вам не нужно переопределять свой макет в каждом представлении.2. @JohnH да, я использую layout.cshtml У меня тоже есть модель типа User в начале моего кода. Извините, я должен был добавить это в вопрос..
3. Хорошо, у вас здесь проблема. Добавляя эту
@model User
директиву к вашей_Layout.cshtml
, это означает, что вы ожидаете, что каждое действие контроллера будет передаватьUser
модель. Вы можете убедиться в этом сами, создав новый контроллер, создав для него новый тип модели, добавив соответствующий вид и указав@model NewModel
в его верхней части. Если вы перейдете к маршруту, он выдаст, потому что он все равно будет ожидатьUser
.4. Для того, что вы хотите сделать (т. Е. Иметь регистрационную форму, которая всегда видна, независимо от того, какой маршрут просматривает пользователь), и предполагая MVC 5, посмотрите, как работают дочерние действия, в частности, с использованием
@Html.RenderAction()
или@Html.RenderPartial()
в вашем макете. Это позволит вам переместить имеющийся у вас код в отдельный.cshtml
, который ожидает вашегоUser
, в то время как у вас могут быть другие маршруты, работающие с использованием других моделей.
Ответ №1:
Я, наконец, нашел решение этой проблемы. Пришлось добавить следующие файлы скриптов. Спасибо, ребята, за ваше время!
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/jqueryvalidate/1.19.1/jquery.validate.js">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-
unobtrusive/3.2.11/jquery.validate.unobtrusive.js"></script>
Комментарии:
1. Спасибо за публикацию вашего решения, но, пожалуйста, в какой-то момент прочтите мои комментарии.
2. @JohnH большое вам спасибо за объяснение! Я понятия не имел об этом. Тем не менее, мой веб-сайт действительно маленький, и у меня есть только одно действие в моем контроллере, поэтому пока оно работает для меня. Но я обязательно буду помнить об этом для будущего использования.