C # MVC CMS - Настройка удаленной проверки
По ссылке ниже я задал вопрос о том, как обеспечить, чтобы поле еще не содержало того же значения (например, когда есть уникальное ограничение для поля, которое корректно вызывает C # для исключения, когда обнуляется). Получив ответ, я решил эту проблему, но представил другую.
Обеспечение того, что другая запись еще не содержит того же значения для поля
Основная проблема, с которой я столкнулся, заключается в том, что при создании нового представления. Проверка работает как ожидалось. Вкратце - система должна проверить, что ViewName и ViewPath (маршрут) являются уникальными, поэтому требуется поиск в БД.
Однако, когда я редактирую представление, проверка запускается снова (и на самом деле это не должно происходить, потому что, очевидно, представление уже существует, потому что вы его редактируете).
Теперь моя проблема заключается в том, как настроить удаленную проверку, чтобы она работала по-разному для редактирования и создания. Хотя мы не должны иметь возможности редактировать имя представления в соответствии с существующим представлением, мы также не должны останавливаться на сохранении текущего представления просто потому, что оно совпадает с текущим представлением.
Ниже моя Модель (та часть, которая (надеюсь) не генерируется инструментом :-):
[MetadataType(typeof(IViewMetaData))]
public partial class View : IViewMetaData { }
public interface IViewMetaData
{
[Required(AllowEmptyStrings = false, ErrorMessageResourceType = typeof(DALResources), ErrorMessageResourceName = "ErrorRequiredField")]
[StringLength(50, ErrorMessageResourceType = typeof(DALResources), ErrorMessageResourceName = "ErrorLessThanCharacters")]
[Display(ResourceType = typeof(DALResources), Name = "ViewName")]
[Remote("IsViewNameAvailable", "Validation")]
string ViewName { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessageResourceType = typeof(DALResources), ErrorMessageResourceName = "ErrorRequiredField")]
[StringLength(400, ErrorMessageResourceType = typeof(DALResources), ErrorMessageResourceName = "ErrorLessThanCharacters")]
[Display(ResourceType = typeof(DALResources), Name = "ViewPath")]
[Remote("IsViewPathAvailable", "Validation")]
string ViewPath { get; set; }
[Display(ResourceType = typeof(DALResources), Name = "ViewContent")]
string ViewContent { get; set; }
}
У меня проблема с атрибутом проверки [Remote], который определен ниже:
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public class ValidationController : Controller
{
private FRCMSV1Entities db = new FRCMSV1Entities();
public JsonResult IsViewNameAvailable(View view)
{
bool isViewNameInvalid = db.View.Any(v => v.ViewName == view.ViewName && v.Id != view.Id);
if (!isViewNameInvalid)
return Json(true, JsonRequestBehavior.AllowGet);
string suggestedViewName = string.Format(UI_Prototype_MVC_Resources.ErrorViewAlreadyExists, view.ViewName);
for (int i = 1; i < 100; i++)
{
string altViewName = view.ViewName + i.ToString();
bool doesAltViewNameExist = db.View.Any(v => v.ViewName == altViewName);
if (!doesAltViewNameExist)
{
suggestedViewName = string.Format(UI_Prototype_MVC_Resources.ErrorViewNotAvailableTry, view.ViewName, altViewName);
break;
}
}
return Json(suggestedViewName, JsonRequestBehavior.AllowGet);
}
public JsonResult IsViewPathAvailable(View view)
{
bool doesViewPathExist = db.View.Any(v => v.ViewPath == view.ViewPath && v.Id != view.Id);
if (!doesViewPathExist)
return Json(true, JsonRequestBehavior.AllowGet);
string suggestedViewPath = string.Format(UI_Prototype_MVC_Resources.ErrorViewAlreadyExists, view.ViewPath);
for (int i = 1; i < 100; i++)
{
string altViewPath = view.ViewPath + i.ToString();
bool doesAltViewPathExist = db.View.Any(v => v.ViewPath == altViewPath);
if (!doesAltViewPathExist)
{
suggestedViewPath = string.Format(UI_Prototype_MVC_Resources.ErrorViewNotAvailableTry, view.ViewPath, altViewPath);
break;
}
}
return Json(suggestedViewPath, JsonRequestBehavior.AllowGet);
}
}
Проблема в том, что проверка должна работать одинаково как при создании, так и при редактировании. Просто нужно выполнить дополнительную проверку редактирования, чтобы убедиться, что мы все еще ссылаемся на ту же запись, и если это так, то нет необходимости показывать сообщение проверки, потому что в этом нет ничего плохого.
Мой вопрос: 1. Как мне заставить это работать как ожидалось. 2. Я вижу, что оба метода в значительной степени идентичны, что нарушает принцип СУХОГО. Как я могу сделать это более общим и упростить это. Однако на первый вопрос я действительно хотел бы ответить, потому что нет смысла рефакторинг чего-то, что не работает.
Для получения дополнительной информации вышеуказанный код также является редактированием кода по следующей ссылке:
https://msdn.microsoft.com/en-us/library/gg508808(VS.98).aspx
Спасибо за любую помощь.