#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 кодировке. Если не найдет, то подставит знак вопроса.
Комментариев нет:
Отправить комментарий