هل هناك طريقة لتضمين معرف الجزء عند استخدام Asp.Net MVC ActionLink أو RedirectToAction وما إلى ذلك؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

أريد أن تتضمن بعض الروابط معرف جزء.مثل بعض عناوين URL الموجودة على هذا الموقع:

التصحيح:IE6 + SSL + AJAX + نموذج النشر = خطأ 404#5626

هل هناك طريقة للقيام بذلك باستخدام أي من الطرق المضمنة في MVC؟أم هل يجب أن أستخدم مساعدي HTML الخاصين بي؟

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

المحلول

نحن نتطلع إلى تضمين الدعم لهذا في إصدارنا التالي.

نصائح أخرى

كما كتب براد ويلسون، يمكنك بناء الرابط الخاص بك في وجهات النظر الخاصة بك عن طريق سلسلة السلاسل ببساطة.لكن لإلحاق اسم جزء بعملية إعادة توجيه تم إنشاؤها عبر RedirectToAction (أو ما شابه)، ستحتاج إلى شيء مثل هذا:

public class RedirectToRouteResultEx : RedirectToRouteResult {

    public RedirectToRouteResultEx(RouteValueDictionary values)
        : base(values) {
    }

    public RedirectToRouteResultEx(string routeName, RouteValueDictionary values)
        : base(routeName, values) {
    }

    public override void ExecuteResult(ControllerContext context) {
        var destination = new StringBuilder();

        var helper = new UrlHelper(context.RequestContext);
        destination.Append(helper.RouteUrl(RouteName, RouteValues));

        //Add href fragment if set
        if (!string.IsNullOrEmpty(Fragment)) {
            destination.AppendFormat("#{0}", Fragment);
        }

        context.HttpContext.Response.Redirect(destination.ToString(), false);
    }

    public string Fragment { get; set; }
}

public static class RedirectToRouteResultExtensions {
    public static RedirectToRouteResultEx AddFragment(this RedirectToRouteResult result, string fragment) {
        return new RedirectToRouteResultEx(result.RouteName, result.RouteValues) {
            Fragment = fragment
        };
    }
}

وبعد ذلك، في وحدة التحكم الخاصة بك، يمكنك الاتصال:

return RedirectToAction("MyAction", "MyController")
       .AddFragment("fragment-name");

من المفترض أن يؤدي ذلك إلى إنشاء عنوان URL بشكل صحيح.

في MVC3 (وربما لم أقم بالتحقق من ذلك سابقًا)، يمكنك استخدام UrlHelper.GenerateUrl لتمرير معلمة الجزء.إليك طريقة مساعدة أستخدمها لتغليف الوظيفةL

public static string Action(this UrlHelper url, string actionName, string controllerName, string fragment, object routeValues)
{
    return UrlHelper.GenerateUrl(
        routeName: null,
        actionName: actionName,
        controllerName: controllerName,
        routeValues: new System.Web.Routing.RouteValueDictionary(routeValues),
        fragment: fragment,
        protocol: null,
        hostName: null,
        routeCollection: url.RouteCollection,
        requestContext: url.RequestContext,
        includeImplicitMvcValues: true /*helps fill in the nulls above*/
    );
}

@ دومينيك،

أنا متأكد تقريبًا من أن وضع ذلك في المسار سيؤدي إلى مشكلات في التوجيه.

@ريكي،

وإلى أن تحصل شركة MVC على دعم لهذا، يمكنك أن تكون "مدرسة قديمة" أكثر قليلاً فيما يتعلق بكيفية إنشاء مساراتك.على سبيل المثال، يمكنك تحويل:

<%= Html.ActionLink("Home", "Index") %>

داخل:

<a href='<%= Url.Action("Index") %>#2345'>Home</a>

أو يمكنك كتابة مساعدك الخاص الذي يقوم بنفس الشيء بشكل أساسي.

الجواب القصير هو:لا.في ASP.NET MVC Preview 3، لا توجد طريقة من الدرجة الأولى لتضمين رابط في رابط الإجراء.على عكس url_for :anchor في Rails، لا يحتوي UrlHelper.GenerateUrl (و ActionLink وRedirectToAction وما إلى ذلك) على اسم خاصية سحرية تتيح لك تشفير المرساة.

كما أشرت ، يمكنك أن تقوم بذلك بنفسك.ربما يكون هذا هو الحل الأنظف.

بطريقة سهلة، يمكنك فقط تضمين نقطة ارتساء في المسار وتحديد القيمة في تجزئة المعلمات الخاصة بك:

routes.MapRoute("WithTarget", "{controller}/{action}/{id}#{target}");
...
<%= Html.ActionLink("Home", "Index", new { target = "foo" })%>

سيؤدي هذا إلى إنشاء عنوان URL مثل /Home/Index/#foo.لسوء الحظ، لا يتوافق هذا بشكل جيد مع معلمات عنوان URL، التي تظهر في نهاية عنوان URL.لذا فإن هذا الاختراق لا يمكن تنفيذه إلا في ظروف بسيطة جدًا حيث تظهر جميع المعلمات كمكونات مسار URL.

هذا حل من جانب العميل ولكن إذا كان لديك jquery متاحًا، فيمكنك القيام بشيء مثل هذا.

<script language="javascript" type="text/javascript">
    $(function () {
        $('div.imageHolder > a').each(function () {
            $(this).attr('href', $(this).attr('href') + '#tab-works');
        });
    });
</script>

معرفات الأجزاء مدعومة في MVC 5.يرى ActionLinkالأحمال الزائدة في https://msdn.microsoft.com/en-us/library/dd460522(v=vs.118).aspx و https://msdn.microsoft.com/en-us/library/dd492938(v=vs.118).aspx.

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