#c_sharp #база_данных #aspnet_mvc #entity_framework
Сделал регистрацию на сайте 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" })} @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:
Ответы
Ответ 1
EF кэширует модель базы в момент рефреша. У вас в Model1.edmx/edmx:StorageModels написано следующее:И это заставляет EF криво мапить данные. Рефреш модели на основе базы решает проблему. Ответ 2
Если в запросе задается юникодная константа, то перед ней нужно обязательно ставить символ N. Чтобы показать разницу, достаточно простого запроса: SELECT '致死罪 ANSI', N'致死罪 UNICODE' ??? ANSI 致死罪 UNICODE Если не указывать N перед константой, то SQL Server будет пытаться искать подходящий символ в ANSI кодировке. Если не найдет, то подставит знак вопроса.
Комментариев нет:
Отправить комментарий