我在路由表中有一些预先定义的URL实际上指向同一个控制器和操作,但是语言不同。例如
routes.MapRoute(
"Contact", // Route name
"contact", // URL with parameters
new { controller = "Home", action = "Contact", lang="en" } // Parameter defaults
);
routes.MapRoute(
"Contact2", // Route name
"iletisim", // URL with parameters
new { controller = "Home", action = "Contact", lang="tr" } // Parameter defaults
);
当我在View中使用Html.ActionLink
并运行应用程序时,URL显示第一条路线,例如:
@Html.ActionLink(Resources.Contact, "Contact", "Home")
当页面呈现的网址为tr
时,当前语言为/contact
,而/iletisim
应为en
。
当我更改路由映射的顺序时,{{1}}语言页面显示错误的URL。
我该如何解决这个问题?
答案 0 :(得分:1)
匹配来自package com.app.rest;
import com.squareup.okhttp.Response;
import retrofit.GsonConverterFactory;
import retrofit.Retrofit;
import retrofit.RxJavaCallAdapterFactory;
import retrofit.http.GET;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class TestApiClient {
public interface Test {
@GET("/posts")
Observable<Response> getPosts();
}
public TestApiClient() {
new Retrofit.Builder()
.baseUrl("http://jsonplaceholder.typicode.com")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build().create(Test.class).getPosts().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Response>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.toString();
}
@Override
public void onNext(Response response) {
response.toString();
}
});
}
}
的路线时,必须考虑路线生成的所有参数。框架将始终返回所提供路径值的第一个匹配项。
在您的情况下,您提供路线值:
ActionLink
如果缺少其他信息,则与controller = "Home"
action = "Contact"
路线(第一条路线Contact
)相符。
如果您想匹配特定路线,则还需要传递controller = "Home", action = "Contact"
路线值。
lang
这将匹配@Html.ActionLink(Resources.Contact, "Contact", "Home", new { lang = "tr" }, null)
路线。
或者,您可以将Contact2
放入页面的网址中,这样可以确保它是当前请求的一部分,如ASP.NET MVC 5 culture in route and url
所示。然后,MVC会自动将此值提供给您的所有lang
和其他基于ActionLinks
的方法。