Ответ 1
Метод расширения кажется правильным и является способом перехода.
Я строю url используя метод:
Url.Action("action", "controller");
Мне нравится передавать запрос для текущего запроса в этот URL-адрес. Что-то вроде следующего (но это не работает):
Url.Action("action", "controller", Request.QueryString);
Преобразование QueryString в значения маршрута возможно со следующим расширением:
public static RouteValueDictionary ToRouteValues(this NameValueCollection queryString)
{
if (queryString.IsNull() || queryString.HasKeys() == false) return new RouteValueDictionary();
var routeValues = new RouteValueDictionary();
foreach (string key in queryString.AllKeys)
routeValues.Add(key, queryString[key]);
return routeValues;
}
С помощью метода расширения выполняется следующее:
Url.Action("action", "controller", Request.QueryString.ToRouteValues());
Есть ли другой лучший способ? спасибо
Метод расширения кажется правильным и является способом перехода.
Если вы хотите легко добавить дополнительные параметры маршрута в свой Url.Action, попробуйте этот метод расширения (на основе Linefeed), который принимает анонимный объект и возвращает RouteValueCollection:
public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj)
{
var values = new RouteValueDictionary(obj);
if (col != null)
{
foreach (string key in col)
{
//values passed in object override those already in collection
if (!values.ContainsKey(key)) values[key] = col[key];
}
}
return values;
}
Затем вы можете использовать его так:
Url.Action("action", "controller", Request.QueryString.ToRouteValues(new{ id=0 }));
Здесь мое решение основано на ответе pwhe23. Я хотел сохранить параметры строки запроса через запросы POST (из-за Mvc.Grid) и использовать только одно действие для HTTP GET. Действия CRUD обрабатываются одной страницей и модальными диалогами внутри (для вставки/обновления/удаления).
Итак, здесь мое расширение:
public static class MvcExtensions
{
public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj = null)
{
var values = obj != null ? new RouteValueDictionary(obj) : new RouteValueDictionary();
if (col == null) return values;
foreach (string key in col)
{
//values passed in object are already in collection
if (!values.ContainsKey(key)) values[key] = col[key];
}
return values;
}
}
Использование в контроллере (например, действие "Редактировать" ):
[HttpPost]
public ActionResult Edit(MyModel model)
{
// Some stuff
return RedirectToAction("Index", Request.QueryString.ToRouteValues());
}
Форма для редактирования, сгенерированная в представлении (используется модальный диалог):
@using (Html.BeginForm("Edit", "SomeControllerName", Request.QueryString.ToRouteValues(), FormMethod.Post))
{
// Some stuff... e.g. dialog content
}