الربيع MVC، وحدة تحكم واحدة ل "إضافة" و "التحديث" عند استخدام setDisallowedFields؟

StackOverflow https://stackoverflow.com/questions/826385

  •  05-07-2019
  •  | 
  •  

سؤال

وهكذا لقد حصلت على نموذج بسيط من خلالها يمكنني إما "إضافة" شيء جديد، أو "تحديث" لشيء موجود.

ما أود هو أن يكون تحكم واحدة يمكن أن العملية على حد سواء إضافة وتحديث. في البداية هذا يبدو بسيطا بما فيه الكفاية، حتى أرى أن مشكلة استخدام setDisallowedFields في بلدي InitBinder بحيث لا يسمح حقل "معرف" عند إضافة شيء جديد.

وحاليا لدي جهازي تحكم مع ما يمكن أن يكون كود متطابقة باستثناء طريقة InitBinder.

وأي اقتراحات أو مشورة؟ (أنا مستعد لسماع الحجة أنني يجب أن ترغب في الحفاظ على وحدات التحكم اثنين أيضا، إذا كنت تستطيع أن تعطيني أسباب وجيهة)

هل كانت مفيدة؟

المحلول

في الواقع، يجب عدم السماح حقل "معرف" على حد سواء عند إضافة وتحديث. وإلا يمكن لمستخدم ضار العبث قيمة "معرف" طلب المعلمة من طلب التحديث، وبالتالي تحديث سجل مختلفة إلى واحد هو مبين من خلال النموذج (على افتراض ليس هناك قوائم ACL أو غيرها من الأمان على مستوى المجال).

ولكن إذا كنت ببساطة عدم السماح حقل "معرف"، وحدة تحكم علاج ID باعتبارها لاغية، والتي سوف تعمل عند إدخال ولكن ليس عند تحديث (على سبيل المثال قد محاولة إدراج سجل جديد بدلا من تحديث، اعتمادا على ما آلية استمرار كنت تستخدم). لذلك أردت وحدة تحكم لتذكر القيم غير قابلة للتحرير من كائن المجال (لا معرفات فقط، ولكن كل المجالات غير مسموح بها) بين طلبات بحيث يمكن إرسال جميع القيم الصحيحة لخدمة طبقة أو منطق الأعمال الأخرى. ويتم ذلك باستخدام الشرحSessionAttributes على مستوى نوع، على النحو التالي (غيرها من الشروح حذفت لوضوح):

@SessionAttributes("thing") // the name of your domain object in the model
public class ThingController {

    public void setDisallowedFields(WebDataBinder binder) {
        binder.setDisallowedFields("id", "someOtherUneditableField");
    }

    // request handling methods go here as before
}

لأمن أفضل، تعيين الحقول يسمح بدلا من الحقول غير مسموح بها. وفي كلتا الحالتين كنت في حاجة إلىSessionAttributes الشرح لملء في أي مجال القيم الحالية يتم تجاهل من الطلب.

نصائح أخرى

والتوقيع طريقة لinitBinder يأخذ في HttpServletRequest:

protected void initBinder(HttpServletRequest request, 
    ServletRequestDataBinder binder)

وربما لذلك يمكن أن يكون initBinder() تحقق المعلمات طلب لتحديد ما إذا كان يجب تعيين مشروط setDisallowedFields؟

و(إذا كان هذا لا يساعد، وربما أنا لا فهم المشكلة بشكل صحيح ...)

والطريقة أن أفعل هذا مع وحدة تحكم واحد هو أن تكون هناك منطقية على الكائن أمري يشير إذا كان كائن جديد أم لا. في onSubmit يمكنني ثم تحقق من منطقية لمعرفة ما إذا كنت بحاجة إلى تنفيذ إجراء الإضافة أو التحديث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top