سؤال

لا بد لي من تسجيل القيد HttpVerb في تعريفي الطريق (عندما أكون تسجيل طرق) إذا كنت قد زينت لي طريقة العمل مع [AcceptVerbs (..)] السمة بالفعل؟

وعلى سبيل المثال. لدي هذا.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }

هل أنا بحاجة لإضافة هذا الطريق الذي يشير إلى هذا العمل، كعائق؟

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

المحلول

والفرق بين الاثنين هو التالي: لنفترض طريقة Create في السؤال هو على HomeController

<ع> استخدام السمة AcceptVerbs لا يؤثر التوجيه. انها في الواقع شيئا المستخدمة من قبل المنادي العمل. ما يسمح لك القيام به هو لديك 2 طرق عمل على وحدة تحكم بنفس الاسم التي تستجيب كل لطريقة HTTP مختلفة.

public ActionResult Create(int id) { .. }

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection) { .. }

وهكذا عندما يأتي طلب /home/create في، والطريق مباراة وتسليم قبالة طلب إلى المنادي وحدة التحكم. والمنادي ثم استدعاء الأسلوب الصحيح من خلال النظر في السمة AcceptVerbs.

وسوف باستخدام HttpMethodConstraint في التوجيه جعله مثل هذا الطريق في حد ذاته سوف لا تتطابق مع الطلب. لذلك عندما يأتي طلب POST في ل/home/create، وسوف يطلق يست طريقة عمل لأن هذا الطريق لا يتطابق مع الطلب. فمن الممكن أن طريقا آخر <م> سوف تطابق هذا الطلب بالرغم من ذلك.

وجزء من السبب في التداخل هنا هو أن التوجيه هو سمة من سمات ASP.NET 3.5 SP1 وليس خاصا MVC. MVC يستخدم التوجيه، ولكنها تستخدم أيضا من قبل التوجيه الديناميكي للبيانات، ونحن نخطط لدمج التوجيه مع نماذج ويب ASP.NET.

نصائح أخرى

وكلا - خلق سوف تستجيب فقط لطلبات POST

هل يمكن أن يكون تطبيقات أخرى من خلق مع سمات AcceptVerb مختلفة، أو واحد مع عدم وجود السمة التي سوف قبض على جميع طلبات أخرى.

إذا كان ذلك من طريقة فقط خلق، أي GET (أو غيرهم من غير ما بعد) من شأنه أن يؤدي الطلب في 404.

وأفترض تحت غطاء محرك السيارة هو كل شيء يجري ذلك عن طريق محرك التوجيه على أي حال. [عدل: كلا، انظر آخر Haacked ل]

والأولى تزيين مثل هذا:

[ActionName("ItemEdit"), AcceptVerbs(HttpVerbs.Post)]
public virtual object ItemSave(Menu sampleInput)

وبعد ذلك تحتاج إلى إضافة مسار مثل هذا:

 AddRoute(
                "SampleEdit",
                "Admin/{sampleID}/Edit",
                new { controller = "Sample", action = "ItemEdit", validateAntiForgeryToken = true },
                new { areaID = new IsGuid() },
                new { Namespaces = controllerNamespaces }
           );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top