C # MVC CMS - Anpassen der Remote-Validierung

Über den folgenden Link habe ich eine Frage gestellt, wie sichergestellt werden kann, dass ein Feld nicht bereits denselben Wert enthält (z. B. wenn ein Feld eine eindeutige Einschränkung aufweist, durch die C # bei Voilierung korrekterweise eine Ausnahme auslöst). Mit der Antwort, die ich erhielt, löste es dieses Problem, präsentierte aber ein anderes.

Versichern, dass ein anderer Datensatz nicht bereits denselben Wert für ein Feld enthält

Das Hauptproblem, das ich jetzt habe, ist das, wenn ich eine neue Ansicht erstelle. Die Validierung funktioniert wie erwartet. In Kürze - Das System muss überprüfen, ob ViewName und ViewPath (Route) eindeutig sind, sodass eine Suche in der Datenbank erforderlich ist.

Wenn ich jedoch die Ansicht bearbeite, wird die Überprüfung erneut gestartet (und dies sollte eigentlich nicht der Fall sein, da die Ansicht offensichtlich bereits vorhanden ist, da Sie sie bearbeiten).

Mein Problem ist nun, wie ich die Remote-Validierung so anpasse, dass sie beim Bearbeiten und Erstellen anders funktioniert. Wir sollten nicht in der Lage sein, den Namen einer Ansicht so zu bearbeiten, dass er mit einer vorhandenen Ansicht übereinstimmt, aber wir sollten auch nicht daran gehindert werden, die aktuelle Ansicht zu speichern, nur weil sie mit der aktuellen Ansicht identisch ist.

Below ist mein Modell (der Teil, der (hoffentlich) nicht von einem Tool generiert wird: -):

[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; }
}

Der Teil, mit dem ich ein Problem habe, ist das unten definierte Validierungsattribut [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);
    }
}

Das Problem ist, dass die Validierung sowohl beim Erstellen als auch beim Bearbeiten gleich funktionieren muss. Es muss nur eine zusätzliche Überprüfung der Bearbeitung durchgeführt werden, um sicherzustellen, dass immer noch auf denselben Datensatz verwiesen wird. In diesem Fall muss die Überprüfungsmeldung nicht angezeigt werden, da nichts falsch ist.

Meine Frage ist: 1. Wie bekomme ich das, um wie erwartet zu arbeiten. 2. Ich kann sehen, dass beide Methoden ziemlich identisch sind, was gegen das DRY-Prinzip verstößt. Wie kann ich dies allgemeiner gestalten und vereinfachen? Die erste Frage ist jedoch wirklich die, die ich gerne beantwortet hätte, da es keinen Sinn macht, etwas umzugestalten, das nicht funktioniert.

Für weitere Informationen ist der obige Code auch eine Bearbeitung des Codes unter folgendem Link:

https: //msdn.microsoft.com/en-us/library/gg508808 (VS.98) .aspx

ielen Dank für jede Hilf

Antworten auf die Frage(2)

Ihre Antwort auf die Frage