Страницы

Поиск по вопросам

среда, 13 марта 2019 г.

В БД кириллица записывается как “?????”

Сделал регистрацию на сайте asp.net MVC 5, с использованием EF. При добавлении строки в таблицу, поле с кириллицей записывается как "?????".
Столбец типа NVARCHAR(100), так что проблема не в БД. На HTML-странице использую UTF-8 кодировку, как и файл этого контроллера и самой страницы. Выводит из БД русский текст тоже без проблем.
Может, проблема в самом сервере? Или что-то добавить в Web.config? Пробовал добавлять в connectionStrings параметр charset=utf8 в разные места, ловил исключения:
The underlying provider failed on ConnectionString. Keyword not supported: 'charset'.
Установлена английская Visual Studio Enterprise 2015 (v.14.0.25420.01 Update 3). В настройках проекта: Neutral Language: Russian (Russia)

Код страницы:
@model HotelSystem.hs_users
@{ Layout = null; }
HotelSystem - Регистрация @Scripts.Render("~/bundles/modernizr") @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/jqueryval") @Html.Partial("_Header") @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary(true, "", new { @class = "text-danger" })

Создание аккаунта


@Html.EditorFor(model => model.username, new { htmlAttributes = new { @placeholder = "Логин" } }) @Html.ValidationMessageFor(model => model.username, "", new { @class = "text-danger" })
@Html.EditorFor(model => model.email, new { htmlAttributes = new { @placeholder = "Email" } }) @Html.ValidationMessageFor(model => model.email, "", new { @class = "text-danger" })
@Html.EditorFor(model => model.password, new { htmlAttributes = new { @placeholder = "Пароль" } }) @Html.ValidationMessageFor(model => model.password, "", new { @class = "text-danger" })
@Html.EditorFor(model => model.confirmPassword, new { htmlAttributes = new { @placeholder = "Подтверждение пароля" } }) @Html.ValidationMessageFor(model => model.confirmPassword, "", new { @class = "text-danger" })
@Html.EditorFor(model => model.fullname, new { htmlAttributes = new { @placeholder = "Полное имя" } }) @Html.ValidationMessageFor(model => model.fullname, "", new { @class = "text-danger" })
}
@Scripts.Render("~/bundles/bootstrap")
Код контроллера:
using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc;
namespace HotelSystem.Controllers { public class userController : Controller { HotelSystemDatabaseEntities1 db = new HotelSystemDatabaseEntities1();
...
public ActionResult register() { return View(); }
[HttpPost] [ValidateAntiForgeryToken] public ActionResult register(hs_users U) { if (ModelState.IsValid) { U.role = 1; U.time = DateTime.Now; db.hs_users.Add(U); db.SaveChanges(); ModelState.Clear(); U = null; return RedirectToAction("index", "home"); } return View(U); }
[HttpPost] public JsonResult doesUserNameExist(string username) { int user = 0; try { user = db.hs_users.Count(u => u.username == username); } catch { }
if (user == 0) { return Json(true); } else { return Json(false); } }
[HttpPost] public JsonResult doesEmailAddressExist(string email) { int user = 0; try { user = db.hs_users.Count(u => u.email == email); } catch { }
if (user == 0) { return Json(true); } else { return Json(false); } } } }
Код модели:
namespace HotelSystem { using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web.Mvc;
public partial class hs_users { public long ID { get; set; }
[Required(ErrorMessage = "Заполните поле")] [Remote("doesUserNameExist", "user", HttpMethod = "POST", ErrorMessage = "Такой логин уже зарегистрирован")] [RegularExpression(@"^(?!.*\.\.)(?!.*\.$)[^\W][\w.]{2,49}$", ErrorMessage = "Некорректный логин")] public string username { get; set; }
[Required(ErrorMessage = "Заполните поле")] [StringLength(50, ErrorMessage = "Пароль должен быть от {2} до {1} символов", MinimumLength = 6)] [DataType(DataType.Password)] public string password { get; set; }
[Required(ErrorMessage = "Заполните поле")] [System.Web.Mvc.Compare("password", ErrorMessage = "Введенные пароли не совпадают")] [DataType(DataType.Password)] public string confirmPassword { get; set; }
[Required(ErrorMessage = "Заполните поле")] public string fullname { get; set; }
[Required(ErrorMessage = "Заполните поле")] [Remote("doesEmailAddressExist", "user", HttpMethod = "POST", ErrorMessage = "Такой Email уже зарегистрирован")] [EmailAddress(ErrorMessage = "Введите корректный Email")] public string email { get; set; }
public System.DateTime time { get; set; }
public int role { get; set; } } }
Connection string из файла Web.config


Ответ

EF кэширует модель базы в момент рефреша. У вас в Model1.edmx/edmx:StorageModels написано следующее:

И это заставляет EF криво мапить данные.
Рефреш модели на основе базы решает проблему.

Комментариев нет:

Отправить комментарий