Передача нескольких параметров в контроллер в ASP.NET MVC; также генерирование запросов на лету в LINQ-to-SQL

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

27
задан Rob Burke 28 January 2009 в 15:34
поделиться

3 ответа

  1. Удаляют вид из маршрута. Просто используйте маршрут без параметра.
  2. Добавляют параметры строки запроса к запросу для вида, фильтра, и т.д. Таким образом, Ваш запрос будет похож:

http://example.com/Issue/Open?sort=ID&filter=foo

public ActionResult Open(string sort, string filter)

платформа MVC заполнит аргументы от параметров строки запроса. Удостоверьтесь и используйте nullable типы (как строка) для любого из этих аргументов параметра строки запроса, которые не могли бы быть заполнены в.

я на самом деле думаю, что это - "более корректный" способ записать URL. Сам URL определяет ресурс (нерешенные вопросы); параметры строки запроса настраивают, как отобразить ресурс.

До количества запросов идут, помнят, что Вы не должны создавать весь запрос сразу. Можно использовать.OrderBy дополнительный метод для переупорядочивания существующего IQueryable< T> и так же с.Where.

var Issues = from i in db.Issues where i.Status == "Open" select i;

switch (sort)
{
    case "ID":
        Issues = Issues.OrderBy(i => i.ID);
        break;

    // [...]

    default:
        Issues = Issues.OrderBy(i => i.TimeLogged);
}     
33
ответ дан Craig Stuntz 29 January 2009 в 01:34
поделиться
  • 1
    На самом деле это могло бы даже придерживаться OCP. It’s не большой дизайн, но в действительности it’s, как будто Вы связали два независимых объекта, один изменяемый и один не, под одной ссылкой – millimoose 9 September 2018 в 11:27

Если Вы ожидаете arbitary количество параметров, Вы могли бы сделать что-то вроде этого.


public ActionResult Open(){            
   string[] keys = Request.QueryString.AllKeys;
   Dictionary queryParams = new Dictionary();
   foreach (string key in keys)
   {
     queryParams[key] = Request.QueryString[key];
   }
   string sort = queryParams["sort"];
   ...


10
ответ дан kimsk 29 January 2009 в 01:34
поделиться
  • 1
    у меня есть вопрос: как мы можем достигнуть функциональности как строковый класс для напр. в случае Строки строкового класса firstname = новая Строка (" amar"); Имя строки = " amar"; так и firstname и имя укажут на ту же ячейку памяти на стеке, помогите – Amar Magar 21 January 2016 в 21:46

Это должен быть комментарий к ответу kimsks, но по какой-то причине комментарии требуют, чтобы я прошел проверку, поэтому я должен опубликовать его не в том месте.

Лучший способ справиться с произвольное количество параметров строки запроса - использовать ActionFilter следующим образом:

public class QueryStringFilterAttribute : ActionFilterAttribute
{
    public string ParameterName { get; private set; }

    public QueryStringFilterAttribute(string parameterName)
    {
        if(string.IsNullOrEmpty(parameterName))
            throw new ArgumentException("ParameterName is required.");
        ParameterName = parameterName;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var qs = new FormCollection(filterContext.HttpContext.Request.QueryString);

        filterContext.ActionParameters[ParameterName] = qs;

        base.OnActionExecuting(filterContext);
    }
}

Теперь вы можете добавить атрибут к своему действию, например, [QueryStringFilter («attributes»)] и он будет передавать значения строки запроса как FormCollection . Таким образом, ваше действие будет легче проверить, поскольку оно больше не зависит от синглтона Request .

8
ответ дан 28 November 2019 в 05:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: